_exit()
/ exit_group()
System çağrısına geçen sayı (bazen çıkış kodunun veya sinyal numarasının kodlanmasına da atıfta bulunan çıkış durumuyla belirsizliği önlemek için çıkış kodu olarak da adlandırılır ve işlemin normal şekilde öldürülüp ölülmediğine bağlı olarak ek bilgi) ), Linux gibi Unix benzeri sistemlerde, genellikle -2147483648 (-2 31 ) ila 2147483647 (2 31 -1) değerlerine sahip bir 32bit tam sayıdır .int
Üst süreç (veya çocuk subreaper ya Ancak, tüm sistemlerde, init
ebeveyn ölmüşse) kullanan wait()
, waitpid()
, wait3()
, wait4()
sistem çağrıları sadece bunun alt 8 bit 0 255 (2 kullanılabilir (değerlerdir, geri almak için 8 - 1)).
Kullanırken waitid()
API (veya SIGCHLD üzerinde bir sinyal işleyicisi), en çok sistemlerde (ve POSIX artık daha net bir standart 2016 baskısında gerektirir (bakınız _exit()
özellikleri içinde (tam sayı kullanılabilir,)) si_status
geri yapısının alanındaki ). Yine de Linux'ta durum böyle değil waitid()
, ancak gelecekte de değişmesi muhtemel olsa da, API ile sayıyı 8 bit olarak kısaltır .
Genellikle, yalnızca 0 (genellikle başarı anlamına gelir) değerlerini yalnızca 125 olarak kullanmak istersiniz; zira birçok kabuk , öldürülen bir sürecin sinyal numarasını kodlamak için çıkış durumunu$?
temsil eden 128 ve özel olarak 126 ve 127 koşullar.
exit()
Kabuklar için yaptığınızla aynı şeyi ifade etmek için 126 - 255 kullanmak isteyebilirsiniz $?
(bir komut dosyası olduğu gibi ret=$?; ...; exit "$ret"
). 0 -> 255 dışındaki değerleri kullanmak genellikle yararlı değildir. Bunu yalnızca üst öğenin waitid()
kesilmeyen sistemlerde API'yi kullanacağını ve 32bit değer aralığına ihtiyaç duyduğunuzu bilmeniz durumunda yaparsınız. Eğer bir yaparsanız o Not exit(2048)
Örneğin, bu geleneksel kullanarak ebeveynleri tarafından başarı olarak görülecektir wait*()
API'leri.
Daha fazla bilgi için:
Sorular ve Cevaplar, diğer sorularınızın çoğuna cevap vermeli ve çıkış durumunun ne anlama geldiğini netleştirmelidir . Birkaç şey daha ekleyeceğim:
Bir süreç öldürülmedikçe veya _exit()
/ exit_group()
sistem çağrılarını çağırmadıkça sona erdirilemez . Eğer gelen döndüğünüzde main()
de C
dönüş değeri ile, libc çağrılar bu sistem çağrısı.
Çoğu dil, exit()
bu sistem çağrısını tamamlayan bir fonksiyona sahiptir ve varsa genel olarak sistem çağrısına aktarıldığı takdirde aldıkları değerdir. (C’nin exit()
stdio tamponlarını temizleyen fonksiyonunun yaptığı temizlik gibi genel olarak daha fazla iş yaptığını unutmayın , atexit()
kancaları çalıştırır …)
En azından şu durumda:
$ 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)
Zaman zaman 0-255 dışında bir değer kullandığınızda şikayetçi olanları görürsünüz:
$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1) = ?
Negatif bir değer kullandığınızda bazı mermiler şikayet eder:
$ 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) = ?
exit
Özel yerleşik yapıya iletilen değer 0-255 dışındaysa POSIX davranışı tanımsız bırakır .
Bazı mermiler şu durumlarda bazı beklenmeyen davranışlar gösterir:
bash
(ve mksh
ancak pdksh
bu üzerine dayanır) 8 bit değeri kesecek şekilde kendi üzerine alır:
$ strace -e exit_group bash -c 'exit 1234'
exit_group(210) = ?
Dolayısıyla, bu kabuklarda, 0-255 dışında bir değerle çıkmak istiyorsanız, aşağıdaki gibi bir şey yapmanız gerekir:
exec zsh -c 'exit -- -12345'
exec perl -e 'exit(-12345)'
Aynı süreçte başka komutu çalıştırmak olduğunu edebilir , istediğiniz değere sahip sistem çağrısı diyoruz.
Diğer soru- ksh93
cevaplarda belirtildiği gibi, 257 - 256 + max_signal_number çıkış değerleri için en garip davranışa sahiptir; burada çağrı yapmak yerine, exit_group()
kendisini karşılık gelen sinyal ile¹ öldürür.
$ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
zsh: suspended (signal) ksh -c 'exit "$((256 + $(kill -l STOP)))"'
ve aksi halde bash
/ gibi sayıları keser mksh
.
Though Bir sonraki sürümde olsa değişmesi muhtemel. Şimdi ksh93
AT&T dışında bir topluluk çalışması olarak ele alındığına göre, bu davranış, bir şekilde POSIX tarafından teşvik edilmesine rağmen, geri çevriliyor.
return
, Elbette, bir kabuk yerleşiği.