Di Linux, apa yang terjadi ketika sebuah program (yang mungkin memiliki banyak utas) menerima sinyal, seperti SIGTERM atau SIGHUP?
Utas mana yang memotong sinyal? Bisakah beberapa utas mendapatkan sinyal yang sama? Apakah ada utas khusus yang didedikasikan sepenuhnya untuk menangani sinyal? Jika tidak, apa yang terjadi di dalam utas yang menangani sinyal? Bagaimana eksekusi dilanjutkan setelah rutinitas penangan sinyal selesai?
pthreads(7)
menjelaskan bahwa POSIX.1 membutuhkan semua utas dalam proses berbagi atribut, termasuk:POSIX.1 juga membutuhkan beberapa atribut agar berbeda untuk setiap utas, termasuk:
topeng sinyal (
pthread_sigmask(3)
)tumpukan sinyal alternatif (
sigaltstack(2)
)complete_signal
Rutin kernel Linux memiliki blok kode berikut - komentarnya cukup berguna:Jadi, Anda tahu bahwa Anda bertanggung jawab atas ke mana sinyal dikirimkan:
Jika proses Anda telah menetapkan disposisi sinyal ke
SIG_IGN
atauSIG_DFL
, maka sinyal tersebut diabaikan (atau default - kill, core, atau abaikan) untuk semua utas.Jika proses Anda telah menetapkan disposisi sinyal ke rutinitas penangan tertentu, Anda dapat mengontrol utas mana yang akan menerima sinyal dengan memanipulasi masker sinyal utas tertentu menggunakan
pthread_sigmask(3)
. Anda dapat menominasikan satu utas untuk mengelola semuanya, atau membuat satu utas per sinyal, atau campuran apa pun dari opsi ini untuk sinyal tertentu, atau Anda bergantung pada perilaku default kernel Linux saat ini dalam mengirimkan sinyal ke utas utama.Beberapa sinyal, bagaimanapun, adalah khusus menurut
signal(7)
halaman manual:sumber