Mengapa `kill -l` tidak mencantumkan nomor sinyal 32 dan 33?

18

Eksekusi kill -ldi linux memberi:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Apa yang terjadi dengan 32dan 33? Mengapa tidak dicantumkan? Mereka bisa mulai di 1 dan berakhir di 62 bukannya melewatkan 2 di tengah?

pengguna2555595
sumber
PS Tidak ada "kode kesalahan" - mereka adalah nomor sinyal.
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

20

Itu karena NPTL . Karena ini adalah bagian dari perpustakaan C GNU hampir setiap distribusi linux modern tidak menggunakan dua sinyal real time pertama lagi. NPTL adalah implementasi dari Thread POSIX . NPTL membuat penggunaan internal dari dua sinyal real-time pertama.

Bagian dari halaman sinyal ini sangat menarik:

Kernel Linux mendukung kisaran 32 sinyal real-time yang berbeda, bernomor 33 hingga 64. Namun, implementasi thread glibc POSIX secara internal menggunakan dua (untuk NPTL) atau tiga (untuk LinuxThreads) sinyal waktu-nyata (lihat pthreads (7)) , dan menyesuaikan nilai SIGRTMIN yang sesuai (hingga 34 atau 35). Karena jangkauan sinyal waktu nyata yang tersedia bervariasi sesuai dengan implementasi threading glibc (dan variasi ini dapat terjadi pada waktu berjalan sesuai dengan kernel dan glibc yang tersedia), dan memang kisaran sinyal waktu nyata bervariasi di seluruh sistem UNIX, program harus jangan pernah merujuk ke sinyal waktu nyata menggunakan nomor kode keras, tetapi sebaliknya harus selalu merujuk pada sinyal waktu nyata menggunakan notasi SIGRTMIN + n, dan termasuk pengecekan (run-time) yang sesuai bahwa SIGRTMIN + n tidak melebihi SIGRTMAX.

Saya juga memeriksa kode sumber untuk glibc; lihat baris 22 . __SIGRTMINdinaikkan +2, sehingga dua sinyal real time pertama dikeluarkan dari kisaran sinyal real time.

kekacauan
sumber
Jadi bagaimana cara mendapatkan nilai SIGRTMIN saat ini pada saat dijalankan dalam sepotong kode eksekusi?
SlySven
10

Karena sinyalnya adalah:

SIGWAITING 32 Ignore All LWPs blocked 
    SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library 

Tidak ada yang didukung di Linux. (LWP adalah singkatan dari LightWeight Process )

Sumber: IBM DeveloperWorks Solaris untuk Linux Porting Guide

garethTheRed
sumber
Linux memiliki sinyal 32 dan 33. Lihat: unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signalsbagian.
cuonglm
@Gnouc - sesuai kill -l RTMINmulai dari 34, bukan 32 sesuai dokumen yang Anda referensikan. Yang ini mengatakan itu dimulai pada 33, tetapi selanjutnya mengatakan bahwa Anda tidak harus mereferensikannya dengan angka karena jumlahnya dapat bervariasi tergantung pada implementasi threib glibc.
garethTheRed
Tentu saja bervariasi berdasarkan sistem, tetapi istilah Linux tidak didukung salah. Anda dapat merujuk ini: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Mungkin kita membutuhkan vereran yang bekerja dengan Linux sejak lama untuk memberi tahu kami apa yang terjadi dengan sinyal 32, 33. Mengapa mereka tidak didokumentasikan.
cuonglm
Mereka digunakan secara internal oleh perpustakaan RT pthread - dan di masa lalu akan ada tiga bukan dua karena sistem yang berbeda digunakan banyak untuk keperluan internal. Dari sudut pandang pengkodean Anda tidak seharusnya menggunakan konstanta waktu kompilasi untuk sinyal-sinyal di atas SIGSYS, mis. Satu SIGRTMINset dengan #definegaris karena angka itu dapat berubah sewaktu-waktu ketika executable dijalankan. Ini akan muncul beberapa tahun yang lalu ketika kedua lib pthread sedang digunakan jika aplikasi yang dikompilasi dengan pustaka pthread dijalankan pada sistem yang telah reboot dengan yang lain!
SlySven