Mengapa saya mendapatkan kesalahan 255 ketika mengembalikan -1

10

Saya baru mengenal pemrograman C ++ dan saya punya pertanyaan yang sangat mendasar. Saya perhatikan bahwa ketika saya kembali -1dalam program C ++ dan kemudian memeriksa status keluar, saya mengerti 255. Mengapa demikian?

Kode tersebut adalah yang paling dasar:

int main()
    {
        return -1;
    }

Kemudian, setelah menjalankan kode yang dikompilasi:

echo $?
255
Eugene S
sumber

Jawaban:

24

Karena dalam UNIX / POSIX, kode keluar dari suatu program didefinisikan sebagai nilai 8-bit yang tidak ditandatangani. Konversi -1 menjadi 8-bit yang tidak ditandatangani memberi 255.

Edit untuk ditambahkan:

Untuk memberikan lebih detail: keluarga panggilan * () sistem panggilan dalam UNIX mengkodekan hasil proses menjadi integer 32bit tunggal. 32 bit dari hasil tersebut selanjutnya dipecah untuk memberikan informasi seperti apakah proses dumped core, keluar karena sinyal (dan yang mana), dll. Dari 32 bit itu, hanya 8 bit yang disediakan untuk kode keluar dari proses dan itu ditafsirkan sebagai nilai yang tidak ditandatangani.

Model fork / exec / wait dari UNIX / POSIX adalah salah satu fitur yang paling tua dan paling tertanam; jika Anda merancang sistem operasi baru hari ini Anda mungkin melakukan sesuatu yang berbeda (setidaknya gunakan 64 bit :-)).

Di sisi lain, secara praktis, apakah benar-benar berguna untuk memiliki> 255 kode keluar? Aku meragukan itu. Jika Anda benar-benar menginginkan sesuatu yang lebih kuat, saya sarankan Anda beralih ke "string keluar", alih-alih kode keluar numerik dengan rentang yang lebih luas.

Ilmuwan gila
sumber
Suntingan yang bagus. Terima kasih atas informasi tambahan itu.
George M
7

Mengutip dari bashhalaman manual di EXIT STATUS

Status keluar dari perintah yang dieksekusi adalah nilai yang dikembalikan oleh panggilan sistem pelayan atau fungsi yang setara. Status keluar jatuh antara 0 dan 255, meskipun, seperti dijelaskan di bawah, shell dapat menggunakan nilai di atas 125 khusus. Status keluar dari shell builtin dan perintah majemuk juga terbatas pada kisaran ini. Dalam keadaan tertentu, shell akan menggunakan nilai khusus untuk menunjukkan mode kegagalan tertentu.

Jadi itu membatasi untuk kisaran itu, saya sebenarnya sama terkejutnya seperti Anda.

Dari waitpid (2)halaman manual:

WEXITSTATUS(status)

mengembalikan status keluar anak. Ini terdiri dari 8 bit paling tidak signifikan dari argumen status yang ditentukan anak dalam panggilan untuk keluar (3) atau _exit (2) atau sebagai argumen untuk pernyataan pengembalian di main (). Makro ini hanya boleh digunakan jika WIFEXITED mengembalikan true.

utopiabound
sumber