Saya melihat di banyak perangkat lunak lama dan tutorial buruk di Internet yang merekomendasikan penggunaan exit(-1)
, return -1
atau serupa dengan mewakili "pemutusan abnormal". Masalahnya, setidaknya dalam POSIX, -1
belum pernah dan bukan kode status yang valid. man 3 exit
menggambarkan bahwa exit()
pengembalian nilai status & 0377
kepada orang tua, yang berarti bahwa -1
menjadi 255
. Pada sistem non-POSIX, EXIT_FAILURE
direkomendasikan 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?
sumber
unsigned char
.char
karena rentang nilainya adalah -128 hingga 127. Selanjutnya, saya sudah menyatakan "-1" dikonversi menjadi "255" di badan pertanyaan saya .Jawaban:
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
grep
contoh 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.sumber
exit()
sebagaistatus &= 0xff
. Apakah ada "ukuran kata" yang-1 & 0xff
bukan 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.