Dari mana "keluar (-1)" berasal?

22

Saya melihat di banyak perangkat lunak lama dan tutorial buruk di Internet yang merekomendasikan penggunaan exit(-1), return -1atau serupa dengan mewakili "pemutusan abnormal". Masalahnya, setidaknya dalam POSIX, -1belum pernah dan bukan kode status yang valid. man 3 exitmenggambarkan bahwa exit()pengembalian nilai status & 0377kepada orang tua, yang berarti bahwa -1menjadi 255. Pada sistem non-POSIX, EXIT_FAILUREdirekomendasikan untuk portabilitas. Tapi saya tidak pernah melihat "-1 berarti terminasi abnormal" dalam hubungannya dengan "EXIT_FAILURE mungkin sesuatu selain 1", menunjukkan bahwa mereka jelas percaya "-1" adalah konvensional bahkan pada sistem non-POSIX.

Berikut adalah contoh pertanyaan StackOverflow yang melanggengkan ini. Perangkat lunak "unrealircd" juga merupakan contoh program yang digunakan exit(-1)untuk mengakhiri program. Dalam praktiknya, ini membuatnya sulit untuk berinteraksi systemd.

Dari mana pola anti ini berasal? Apakah ini valid dalam beberapa konteks?

pengguna222973
sumber
1
"Sistem mirip Unix memiliki konvensi yang kuat bahwa status keluar 0 menunjukkan keberhasilan, dan status keluar non-nol menunjukkan kegagalan ... Konvensi ini cukup sulit terhubung ke cangkang Unix ..." ( Status keluar bukan nol untuk keluar bersih )
nyamuk
@gnat Menurut panduan libc , status keluar secara eksplisit termasuk 0 hingga 255. Jika ada jawaban di suatu tempat yang menyatakan bahwa nilai-nilai negatif pada satu titik valid, saya akan menerimanya, tetapi saya merasa sangat ragu.
user222973
1
@gnat "255" mudah masuk ke unsigned char.
user222973
1
@gnat Byte dalam "Java" bukan char yang tidak ditandatangani, ini lebih setara dengan a charkarena rentang nilainya adalah -128 hingga 127. Selanjutnya, saya sudah menyatakan "-1" dikonversi menjadi "255" di badan pertanyaan saya .
user222973

Jawaban:

20

Hampir semua komputer Unix menggunakan dua-pelengkap untuk bilangan bulat, dan dalam dua-pelengkap -1 selalu "semua bit 1" terlepas dari ukuran kata. Jika Anda menginginkan kode keluar paling besar yang mungkin terlepas dari ukuran status keluar program, gunakan -1 dan biarkan perpustakaan memotongnya dengan nyaman melakukan triknya.

Itu berguna karena ketika skrip atau program memiliki lebih dari satu status keluar yang mungkin (lihat grepcontoh sederhana) yang berarti biasanya ditugaskan ke angka terkecil, menjadikan kode keluar terbesar yang mungkin digunakan untuk "kesalahan yang tidak diketahui" atau " batalkan "karena tidak mungkin pernah bertentangan dengan nilai status yang bermakna.

Todd Knarr
sumber
Ambil glibc sebagai contoh, yang mengimplementasikan exit()sebagai status &= 0xff. Apakah ada "ukuran kata" yang -1 & 0xffbukan 255? Tentu saja tidak, karena seluruh tujuannya adalah membuatnya pas di kisaran 0-255. Apapun, kalimat terakhir Anda tidak masuk akal: kode status 128-255 memang memiliki tujuan khusus dalam sistem UNIX.
user222973
2
Jangan bingung nilai keluar Bash (yang 0-127, 128+ menjadi nilai Bash khusus) dengan nilai keluar program (yang 0-255, lihat pubs.opengroup.org/onlinepubs/009695399/functions/exit.html ). Mengenai ukurannya, ingatlah bahwa programmer C telah berurusan dengan beberapa ukuran kata (awalnya 12, 16, dan 32 bit) sejak awal sehingga kami secara otomatis mencoba idiom yang tidak mengharuskan kami untuk mempertimbangkan ukuran kata. Karena Unix mendahului Posix sebelum 2 dekade, tidak selalu ada batasan 8-bit jadi kami menulis jadi tidak masalah.
Todd Knarr