Anda tidak dapat mempercayai bahwa setiap sinyal yang dikirim akan dikirimkan. Sebagai contoh, kernel linux "menyatukan" SIGCHLD jika suatu proses membutuhkan waktu lama dalam menangani SIGCHLD dari proses anak yang sudah keluar.
Untuk menjawab bagian lain dari pertanyaan Anda, sinyal "antri" di dalam kernel jika sejumlah sinyal berbeda datang terlalu pendek.
Anda harus menggunakan sigaction()
untuk mengatur pengendali sinyal dengan sa_sigaction
anggota siginfo_t
, mengatur sa_mask
anggota siginfo_t
argumen dengan hati-hati. Saya pikir ini berarti menutupi semua sinyal "asynch" setidaknya. Menurut halaman manual untuk Linux sigaction()
, Anda juga akan menutupi sinyal yang sedang ditangani. Saya pikir Anda harus mengatur sa_flags
anggota untuk SA_SIGINFO, tetapi saya tidak ingat mengapa saya memiliki takhayul ini. Saya percaya ini akan membuat proses Anda penangan sinyal yang tetap diatur tanpa kondisi balapan, dan yang tidak terganggu oleh sebagian besar sinyal lainnya.
Tulis fungsi penangan sinyal Anda dengan sangat, sangat hati-hati. Pada dasarnya hanya mengatur variabel global untuk menunjukkan bahwa sinyal tertangkap, dan memiliki sisa proses berurusan dengan tindakan yang diinginkan untuk sinyal itu. Sinyal akan ditutup untuk paling sedikit waktu seperti itu.
Selain itu, Anda harus menguji kode penanganan sinyal dengan sangat teliti. Masukkan ke dalam proses pengujian kecil dan kirim sebanyak mungkin sinyal SIGUSR1 dan SIGUSR2, mungkin dari 2 atau 3 program pengiriman sinyal tujuan khusus. Campurkan beberapa sinyal lain juga, setelah Anda yakin bahwa kode Anda dapat menangani SIGUSR1 dan SIGUSR2 dengan cepat dan benar. Persiapkan diri Anda untuk debugging yang sulit.
Jika Anda menggunakan linux dan hanya linux, Anda mungkin berpikir untuk menggunakan signalfd()
untuk membuat deskriptor file yang Anda bisa select()
atau polling untuk menerima sinyal-sinyal itu. Menggunakan signalfd()
mungkin membuat proses debug lebih mudah.
signal(2)
tegas menyarankan agar Anda menghindari kebingungan ini dengan menggunakannyasigaction(2)
.