Terkadang saya sedikit bingung dengan semua sinyal yang dapat diterima oleh suatu proses. Seperti yang saya pahami, sebuah proses memiliki penangan default (disposisi sinyal ) untuk setiap sinyal ini, tetapi ia dapat menyediakan pengendalinya sendiri dengan memanggil sigaction()
.
Jadi inilah pertanyaan saya:apa yang menyebabkan setiap sinyal dikirim? Saya menyadari bahwa Anda dapat mengirim sinyal secara manual ke proses yang sedang berjalan melalui -s
parameter ke kill
, tapi apa yang alami keadaan di mana sinyal-sinyal ini dikirim? Misalnya, kapan SIGINT
dikirim?
Juga, apakah ada batasan sinyal mana yang dapat ditangani? Bahkan bisa SIGSEGV
sinyal diproses dan kontrol dikembalikan ke aplikasi?
Jawaban yang Diterima:
Selain proses yang memanggil kill(2)
, beberapa sinyal dikirim oleh kernel (atau terkadang oleh proses itu sendiri) dalam berbagai keadaan:
- Driver terminal mengirim sinyal yang sesuai dengan berbagai peristiwa:
- Pemberitahuan tekan tombol:
SIGINT
(silakan kembali ke loop utama) di Ctrl +C ,SIGQUIT
(harap segera keluar) di Ctrl + ,SIGTSTP
(mohon ditangguhkan) pada Ctrl +Z . Kunci dapat diubah denganstty
perintah. SIGTTIN
danSIGTTOU
dikirim saat proses latar belakang mencoba membaca atau menulis ke terminal pengontrolnya.SIGWINCH
dikirim untuk memberi sinyal bahwa ukuran jendela terminal telah berubah.SIGHUP
dikirim untuk memberi sinyal bahwa terminal telah hilang (secara historis karena modem Anda h ung naik , saat ini biasanya karena Anda telah menutup jendela emulator terminal).
- Pemberitahuan tekan tombol:
- Beberapa jebakan prosesor dapat menghasilkan sinyal. Detailnya bergantung pada arsitektur dan sistem; berikut adalah contoh tipikal:
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 yang buruk (mis.sqrt(-1)
).
- Sejumlah sinyal memberi tahu proses target bahwa beberapa peristiwa sistem telah terjadi:
SIGALRM
memberitahukan bahwa pengatur waktu yang disetel oleh proses telah kedaluwarsa. Timer dapat disetel denganalarm
,setitimer
dan lainnya.SIGCHLD
memberi tahu sebuah proses bahwa salah satu anaknya telah meninggal.SIGPIPE
dihasilkan ketika sebuah proses mencoba menulis ke pipa ketika akhir pembacaan telah ditutup (idenya adalah jika Anda menjalankanfoo | bar
danbar
keluar,foo
terbunuh olehSIGPIPE
).SIGPOLL
(juga disebutSIGIO
) memberi tahu proses bahwa peristiwa yang dapat disurvei telah terjadi. POSIX menentukan peristiwa yang dapat disurvei yang terdaftar melaluiI_SETSIG
ioctl
. Banyak sistem mengizinkan kejadian yang dapat disurvei pada deskriptor file apa pun, yang disetel melaluiO_ASYNC
fcntl
bendera. Sinyal terkait adalahSIGURG
, yang memberitahukan data penting pada perangkat (terdaftar melaluiI_SETSIG
ioctl
) atau soket.- Pada beberapa sistem,
SIGPWR
dikirim ke semua proses saat UPS memberi sinyal bahwa listrik akan mati.
Daftar ini tidak lengkap. Sinyal standar didefinisikan dalam signal.h
.
Sebagian besar sinyal dapat ditangkap dan ditangani (atau diabaikan) oleh aplikasi. Satu-satunya dua sinyal portabel yang tidak dapat ditangkap adalah SIGKILL
(mati saja) dan STOP
(hentikan eksekusi).
SIGSEGV
(kesalahan segmentasi) dan sepupunya SIGBUS
(kesalahan bus) dapat ditangkap, tetapi itu adalah ide yang buruk kecuali Anda benar-benar tahu apa yang Anda lakukan. Aplikasi umum untuk menangkapnya adalah mencetak jejak tumpukan atau informasi debug lainnya. Aplikasi yang lebih canggih adalah untuk mengimplementasikan beberapa jenis manajemen memori dalam proses, atau untuk menjebak instruksi yang buruk di mesin mesin virtual.
Akhirnya, izinkan saya menyebutkan sesuatu yang bukan merupakan sinyal. Saat Anda menekan Ctrl +D di awal baris dalam program yang membaca input dari terminal, ini memberi tahu program bahwa akhir file input telah tercapai. Ini bukan sinyal:ini ditransmisikan melalui API input/output. Sukai Ctrl +C dan teman-teman, kuncinya dapat dikonfigurasi dengan stty
.