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 dengansttyperintah. SIGTTINdanSIGTTOUdikirim saat proses latar belakang mencoba membaca atau menulis ke terminal pengontrolnya.SIGWINCHdikirim untuk memberi sinyal bahwa ukuran jendela terminal telah berubah.SIGHUPdikirim 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:
SIGBUSuntuk memori akses yang tidak selaras;SIGSEGVuntuk akses ke halaman yang belum dipetakan;SIGILLuntuk instruksi ilegal (opcode buruk);SIGFPEuntuk instruksi floating-point dengan argumen yang buruk (mis.sqrt(-1)).
- Sejumlah sinyal memberi tahu proses target bahwa beberapa peristiwa sistem telah terjadi:
SIGALRMmemberitahukan bahwa pengatur waktu yang disetel oleh proses telah kedaluwarsa. Timer dapat disetel denganalarm,setitimerdan lainnya.SIGCHLDmemberi tahu sebuah proses bahwa salah satu anaknya telah meninggal.SIGPIPEdihasilkan ketika sebuah proses mencoba menulis ke pipa ketika akhir pembacaan telah ditutup (idenya adalah jika Anda menjalankanfoo | bardanbarkeluar,footerbunuh olehSIGPIPE).SIGPOLL(juga disebutSIGIO) memberi tahu proses bahwa peristiwa yang dapat disurvei telah terjadi. POSIX menentukan peristiwa yang dapat disurvei yang terdaftar melaluiI_SETSIGioctl. Banyak sistem mengizinkan kejadian yang dapat disurvei pada deskriptor file apa pun, yang disetel melaluiO_ASYNCfcntlbendera. Sinyal terkait adalahSIGURG, yang memberitahukan data penting pada perangkat (terdaftar melaluiI_SETSIGioctl) atau soket.- Pada beberapa sistem,
SIGPWRdikirim 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 .