Nomor yang diteruskan ke sistem _exit()
/ exit_group()
panggilan (kadang-kadang disebut sebagai kode keluar untuk menghindari ambiguitas dengan status keluar yang juga mengacu pada penyandian kode keluar atau nomor sinyal dan info tambahan tergantung pada apakah proses itu dibunuh atau keluar secara normal ) bertipe int
, jadi pada sistem mirip Unix seperti Linux, biasanya integer 32bit dengan nilai dari -2147483648 (-2 31 ) hingga 2147483647 (2 31 -1).
Namun, pada semua sistem, ketika proses induk (atau subreaper anak atau init
jika orang tua meninggal) menggunakan wait()
, waitpid()
, wait3()
, wait4()
panggilan sistem untuk mengambilnya, hanya 8 bit rendah dari itu tersedia (nilai 0 sampai 255 (2 8 - 1)).
Saat menggunakan waitid()
API (atau penangan sinyal di SIGCHLD), pada sebagian besar sistem (dan seperti POSIX sekarang lebih jelas mensyaratkan dalam edisi standar 2016 (lihat _exit()
spesifikasi )), angka lengkap tersedia (di si_status
bidang struktur yang dikembalikan ). Namun itu tidak terjadi di Linux yang juga memotong angka menjadi 8 bit dengan waitid()
API, meskipun itu kemungkinan akan berubah di masa depan.
Secara umum, Anda hanya ingin menggunakan nilai 0 (umumnya berarti sukses) menjadi 125 saja, karena banyak shell menggunakan nilai di atas 128 dalam $?
representasi mereka dari status keluar untuk menyandikan nomor sinyal dari suatu proses yang terbunuh dan 126 dan 127 untuk khusus kondisi.
Anda mungkin ingin menggunakan 126 hingga 255 exit()
untuk mengartikan hal yang sama seperti yang mereka lakukan untuk shell $?
(seperti ketika skrip melakukannya ret=$?; ...; exit "$ret"
). Menggunakan nilai di luar 0 -> 255 umumnya tidak berguna. Anda biasanya hanya akan melakukannya jika Anda tahu orang tua akan menggunakan waitid()
API pada sistem yang tidak terpotong dan Anda memiliki kebutuhan untuk rentang nilai 32-bit. Perhatikan bahwa jika Anda melakukan exit(2048)
misalnya, itu akan dilihat sebagai keberhasilan oleh orang tua menggunakan wait*()
API tradisional .
Info lebih lanjut di:
T&J tersebut semoga dapat menjawab sebagian besar pertanyaan Anda yang lain dan mengklarifikasi apa yang dimaksud dengan status keluar . Saya akan menambahkan beberapa hal lagi:
Suatu proses tidak dapat berakhir kecuali itu dimatikan atau memanggil sistem _exit()
/ exit_group()
panggilan. Ketika Anda kembali dari main()
dalam C
, libc memanggil sistem itu memanggil dengan nilai kembali.
Sebagian besar bahasa memiliki exit()
fungsi yang membungkus panggilan sistem itu, dan nilai yang diambilnya, jika ada yang umumnya dilewatkan seperti halnya panggilan sistem. (perhatikan bahwa mereka umumnya melakukan lebih banyak hal seperti pembersihan yang dilakukan oleh exit()
fungsi C yang membersihkan buffer stdio, menjalankan atexit()
kait ...)
Setidaknya itulah yang terjadi:
$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234) = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234) = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234) = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)
Anda sesekali melihat beberapa yang mengeluh ketika Anda menggunakan nilai di luar 0-255:
$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1) = ?
Beberapa shell mengeluh ketika Anda menggunakan nilai negatif:
$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2) = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2) = ?
POSIX membiarkan perilaku tidak terdefinisi jika nilai yang diteruskan ke exit
builtin khusus berada di luar 0-> 255.
Beberapa kerang menunjukkan beberapa perilaku tak terduga jika Anda melakukannya:
bash
(dan mksh
tetapi tidak pdksh
berdasarkan yang mana) mengambil sendiri untuk memotong nilai menjadi 8 bit:
$ strace -e exit_group bash -c 'exit 1234'
exit_group(210) = ?
Jadi di shell itu, jika Anda ingin keluar dengan nilai di luar 0-255, Anda harus melakukan sesuatu seperti:
exec zsh -c 'exit -- -12345'
exec perl -e 'exit(-12345)'
Yaitu menjalankan perintah lain dalam proses yang sama yang dapat memanggil system call dengan nilai yang Anda inginkan.
seperti yang disebutkan pada T&J lainnya, ksh93
memiliki perilaku paling aneh untuk nilai keluar dari 257 hingga 256 + max_signal_number di mana alih-alih memanggil exit_group()
, ia membunuh dirinya sendiri dengan sinyal yang sesuai¹.
$ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
zsh: suspended (signal) ksh -c 'exit "$((256 + $(kill -l STOP)))"'
dan sebaliknya memotong angka seperti bash
/ mksh
.
¹ Namun itu kemungkinan akan berubah di versi berikutnya. Sekarang pengembangan ksh93
telah diambil alih sebagai upaya komunitas di luar AT&T, perilaku itu, meskipun didorong oleh POSIX, sedang dipulihkan
return
, Tentu saja, shell builtin.