Terkadang saya sedikit bingung dengan semua sinyal yang dapat diterima oleh suatu proses. Seperti yang saya pahami, suatu proses memiliki pengendali default ( disposisi sinyal ) untuk masing-masing sinyal ini, tetapi ia dapat menyediakan pengendali sendiri dengan memanggil sigaction()
.
Jadi inilah pertanyaan saya: apa yang menyebabkan setiap sinyal dikirim? Saya menyadari bahwa Anda dapat secara manual mengirim sinyal ke proses yang sedang berjalan melalui -s
parameter kill
, tetapi bagaimana keadaan alami di mana sinyal ini dikirim? Misalnya, kapan SIGINT
dikirim?
Juga, apakah ada batasan pada sinyal yang dapat ditangani? Dapatkah bahkan SIGSEGV
sinyal diproses dan kontrol dikembalikan ke aplikasi?
Jawaban:
Selain proses pemanggilan
kill(2)
, beberapa sinyal dikirim oleh kernel (atau terkadang oleh proses itu sendiri) dalam berbagai keadaan:SIGINT
(harap kembali ke loop utama) pada Ctrl+ C,SIGQUIT
(silakan segera berhenti) pada Ctrl+ \,SIGTSTP
(harap ditangguhkan) pada Ctrl+ Z. Kunci dapat diubah denganstty
perintah.SIGTTIN
danSIGTTOU
dikirim ketika proses latar belakang mencoba membaca atau menulis ke terminal pengendali.SIGWINCH
dikirim untuk memberi sinyal bahwa ukuran jendela terminal telah berubah.SIGHUP
dikirim ke sinyal bahwa terminal telah menghilang (historis karena modem Anda memiliki h ung up , saat ini biasanya karena Anda telah menutup jendela terminal emulator).SIGBUS
untuk memori akses yang tidak selaras;SIGSEGV
untuk akses ke halaman yang belum dipetakan;SIGILL
untuk instruksi ilegal (opcode buruk);SIGFPE
untuk instruksi floating-point dengan argumen buruk (misalnyasqrt(-1)
).SIGALRM
memberitahukan bahwa pengatur waktu yang diatur oleh proses telah kedaluwarsa. Pengatur waktu dapat diatur denganalarm
,setitimer
dan lainnya.SIGCHLD
memberi tahu proses bahwa salah satu anaknya mati.SIGPIPE
dihasilkan ketika suatu proses mencoba untuk menulis ke pipa ketika ujung bacaan telah ditutup (idenya adalah bahwa jika Anda berlarifoo | bar
danbar
keluar,foo
terbunuh oleh aSIGPIPE
).SIGPOLL
(Disebut jugaSIGIO
) memberi tahu proses terjadinya suatu peristiwa yang dapat disurvei. POSIX menentukan acara yang dapat dipantau yang terdaftar melaluiI_SETSIG
ioctl
. Banyak sistem memungkinkan acara yang dapat di-polling pada deskriptor file apa pun, ditetapkan melaluiO_ASYNC
fcntl
flag. Sinyal terkait adalahSIGURG
, yang memberitahukan data mendesak pada perangkat (terdaftar melaluiI_SETSIG
ioctl
) atau soket .SIGPWR
dikirim ke semua proses ketika UPS memberi sinyal bahwa kegagalan daya akan segera terjadi.Daftar ini tidak lengkap. Sinyal standar didefinisikan dalam
signal.h
.Sebagian besar sinyal dapat ditangkap dan ditangani (atau diabaikan) oleh aplikasi. Dua sinyal portabel yang tidak dapat ditangkap adalah
SIGKILL
(mati saja) danSTOP
(hentikan eksekusi).SIGSEGV
( kesalahan segmentasi ) dan sepupunyaSIGBUS
( kesalahan bus ) dapat ditangkap, tapi itu ide yang buruk kecuali Anda benar-benar tahu apa yang Anda lakukan. Aplikasi umum untuk menangkap mereka adalah mencetak jejak tumpukan atau informasi debug lainnya. Aplikasi yang lebih maju adalah untuk menerapkan semacam manajemen memori dalam proses, atau untuk menjebak instruksi buruk di mesin mesin virtual.Akhirnya, izinkan saya menyebutkan sesuatu yang bukan sinyal. Ketika Anda menekan Ctrl+ Ddi awal baris dalam program yang membaca input dari terminal, ini memberi tahu program bahwa akhir file input tercapai. Ini bukan sinyal: itu ditransmisikan melalui API input / output. Seperti Ctrl+ Cdan teman-teman, kunci dapat dikonfigurasi dengan
stty
.sumber
SIGFPE
:, agak tidak sengaja, juga ditandai pada integer divide-by-zero, dan kadang-kadang pada integer yang ditandatangani overflow.Untuk menjawab pertanyaan kedua Anda terlebih dahulu:
SIGSTOP
danSIGKILL
tidak dapat ditangkap oleh aplikasi, tetapi setiap sinyal lainnya dapat, bahkanSIGSEGV
. Properti ini berguna untuk debugging - misalnya, dengan dukungan pustaka yang tepat, Anda bisa mendengarkanSIGSEGV
dan membuat stack backtrace untuk menunjukkan di mana segfault itu terjadi.Kata resmi (untuk Linux, apa pun yang dilakukan setiap sinyal tersedia dengan mengetikkan
man 7 signal
dari baris perintah Linux. http://linux.die.net/man/7/signal memiliki informasi yang sama, tetapi tabel lebih sulit dibaca.Namun, tanpa beberapa pengalaman dengan sinyal, sulit untuk mengetahui dari uraian singkat apa yang mereka lakukan dalam praktik, jadi inilah interpretasi saya:
Dipicu dari keyboard
SIGINT
terjadi ketika Anda menekanCTRL+C
.SIGQUIT
dipicu olehCTRL+\
, dan dump inti.SIGTSTP
menunda program Anda ketika Anda menekanCTRL+Z
. Tidak sepertiSIGSTOP
itu, itu dapat ditangkap, yang memberikan program sepertivi
kesempatan untuk mengatur ulang terminal ke keadaan aman sebelum menangguhkan diri.Interaksi terminal
SIGHUP
("hangup") adalah apa yang terjadi ketika Anda menutup xterm (atau memutuskan terminal) saat program Anda sedang berjalan.SIGTTIN
danSIGTTOU
jeda program Anda jika mencoba membaca dari atau menulis ke terminal saat sedang berjalan di latar belakang. AgarSIGTTOU
terjadi, saya pikir program perlu ditulis/dev/tty
, bukan hanya stdout default.Dipicu oleh pengecualian CPU
Ini berarti program Anda mencoba melakukan sesuatu yang salah.
SIGILL
berarti instruksi prosesor yang ilegal atau tidak dikenal. Ini mungkin terjadi jika Anda mencoba mengakses port I / O prosesor secara langsung, misalnya.SIGFPE
berarti ada kesalahan matematika perangkat keras; kemungkinan besar program mencoba membaginya dengan nol.SIGSEGV
berarti program Anda mencoba mengakses wilayah memori yang belum dipetakan.SIGBUS
berarti program mengakses memori dengan cara yang salah; Saya tidak akan membahas detail untuk ringkasan ini.Interaksi proses
SIGPIPE
terjadi jika Anda mencoba menulis ke pipa setelah pembaca pipa menutup ujungnya. Lihatman 7 pipe
.SIGCHLD
terjadi ketika proses anak yang Anda buat berhenti atau ditangguhkan (olehSIGSTOP
atau serupa).Berguna untuk pensinyalan diri
SIGABRT
biasanya disebabkan oleh program yang memanggilabort()
fungsi, dan menyebabkan dump inti secara default. Semacam "tombol panik".SIGALRM
disebabkan olehalarm()
panggilan sistem, yang akan menyebabkan kernel mengirimkanSIGALRM
ke program setelah beberapa detik. Lihatman 2 alarm
danman 2 sleep
.SIGUSR1
danSIGUSR2
bagaimanapun digunakan program suka. Mereka bisa berguna untuk pensinyalan antar proses.Dikirim oleh administrator
Sinyal-sinyal ini biasanya dikirim dari command prompt, melalui
kill
perintah, ataufg
ataubg
dalam kasusSIGCONT
.SIGKILL
danSIGSTOP
merupakan sinyal yang tidak dapat diblokir. Yang pertama selalu mengakhiri proses segera; yang kedua menunda proses.SIGCONT
melanjutkan proses yang ditangguhkan.SIGTERM
adalah versi yang dapat ditangkapSIGKILL
.sumber
shutdown
perintah digunakan?SIGTERM
dikirim terlebih dahulu, diikuti dengan penundaan, diikuti olehSIGKILL
. Pada prinsipnya, untuk shutdown yang keras dan langsung, kernel tidak perlu mengirim sinyal sama sekali; itu bisa berhenti menjalankan proses.