GNU/Linux >> Belajar Linux >  >> Linux

Linux – Nilai Min Dan Maks Dari Kode Keluar Di Linux?

Berapa nilai minimum dan maksimum dari kode keluar berikut di Linux:

  1. Kode keluar yang dikembalikan dari biner yang dapat dieksekusi (misalnya:program C
    ).
  2. Kode keluar yang dikembalikan dari skrip bash (saat memanggil exit ).
  3. Kode keluar yang dikembalikan dari suatu fungsi (saat memanggil return ). Saya
    pikir ini antara dan 255 .

Jawaban yang Diterima:

Nomor yang diteruskan ke _exit() /exit_group() panggilan sistem (terkadang 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 dihentikan atau keluar secara normal) bertipe int , jadi pada sistem mirip Unix seperti Linux, biasanya bilangan bulat 32bit dengan nilai dari -2147483648 (-2) hingga 2147483647 (2-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 yang lebih rendah yang tersedia (nilai 0 hingga 255 (2-1)).

Saat menggunakan waitid() API (atau pengendali sinyal pada SIGCHLD), pada sebagian besar sistem (dan karena POSIX sekarang lebih jelas membutuhkan dalam standar edisi 2016 (lihat _exit() spesifikasi)), nomor lengkap tersedia (di si_status bidang struktur yang dikembalikan). Itu tidak terjadi di Linux yang juga memotong angka menjadi 8 bit dengan waitid() API, meskipun itu kemungkinan akan berubah di masa mendatang.

Umumnya, Anda hanya ingin menggunakan nilai 0 (umumnya berarti sukses) hingga 125 saja, karena banyak shell menggunakan nilai di atas 128 dalam $? representasi dari status keluar untuk mengkodekan nomor sinyal dari proses yang dimatikan dan 126 dan 127 untuk kondisi khusus.

Anda mungkin ingin menggunakan 126 hingga 255 pada exit() memiliki arti yang sama seperti yang mereka lakukan untuk $? shell shell (seperti ketika skrip melakukan ret=$?; ...; exit "$ret" ). Menggunakan nilai di luar 0 -> 255 umumnya tidak berguna. Biasanya Anda hanya akan melakukannya jika Anda tahu orang tua akan menggunakan waitid() API pada sistem yang tidak terpotong dan Anda membutuhkan rentang nilai 32bit. Perhatikan bahwa jika Anda melakukan exit(2048) misalnya, yang akan dilihat sebagai keberhasilan oleh orang tua menggunakan wait*() traditional tradisional API.

Info lebih lanjut di:

  • Kode keluar default saat proses dihentikan?

T&J itu diharapkan dapat menjawab sebagian besar pertanyaan Anda yang lain dan memperjelas apa yang dimaksud dengan status keluar . Saya akan menambahkan beberapa hal lagi:

Suatu proses tidak dapat dihentikan kecuali jika dimatikan atau memanggil _exit() /exit_group() panggilan sistem. Saat Anda kembali dari main() di C , libc memanggil panggilan sistem itu dengan nilai kembalian.

Sebagian besar bahasa memiliki exit() fungsi yang membungkus panggilan sistem itu, dan nilai yang diambilnya, jika ada, umumnya diteruskan apa adanya ke panggilan sistem. (perhatikan bahwa mereka umumnya melakukan lebih banyak hal seperti pembersihan yang dilakukan oleh exit() C C fungsi yang mem-flush buffer stdio, menjalankan atexit() kait…)

Terkait:Linux – Bagaimana Cara Menggunakan Kembali APT Ubuntu?

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)

Terkadang Anda melihat beberapa yang mengeluh saat 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 saat 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 diteruskan ke exit bawaan khusus berada di luar 0->255.

Beberapa shell menunjukkan beberapa perilaku tak terduga jika Anda melakukannya:

  • bash (dan mksh tapi bukan pdksh yang menjadi dasarnya) 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)'
    

    Itu adalah menjalankan perintah lain dalam proses yang sama yang bisa panggil panggilan sistem dengan nilai yang Anda inginkan.

  • seperti yang disebutkan di 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() , itu 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 nomor seperti bash /mksh .


Linux
  1. Tonton perintah dan tugas dengan perintah jam tangan Linux

  2. Pengantar perintah Linux chgrp dan newgrp

  3. Cara memeriksa Versi OS dan Linux

  1. Perintah Sed Linux:Penggunaan dan Contoh

  2. Inode dan sistem file Linux

  3. Cara Menginstal dan Menggunakan Perintah Ping di Linux

  1. Cara Membuat Alias ​​​​dan Menggunakan Perintah Alias ​​​​di Linux

  2. Temukan file dan direktori terbesar di Linux

  3. Ny Cara Mengetahui Ukuran Cache L1, L2, L3 Dan Ram Di Linux?