Sebuah signalfd Linux menjadi readable ketika signal yang dipilih oleh mask-nya berada dalam state pending untuk konteks yang membaca. read(2) yang berhasil mengonsumsi state signal tertunda dan mengembalikan satu atau beberapa record signalfd_siginfo berukuran tetap. Penanganan signal dengan demikian dapat masuk ke event loop berbasis descriptor tanpa menjadikan handler asinkron sebagai mekanisme dispatch utama.
Mask descriptor tidak memblokir signal
Mask yang diberikan ke signalfd(2) memilih signal yang dapat diterima descriptor. Mask tersebut tidak mengubah signal mask milik thread pemanggil. Penggunaan normal memblokir signal itu secara terpisah dengan sigprocmask(2) atau pthread_sigmask(3) agar disposition biasa tidak berjalan sebelum signal dikonsumsi melalui descriptor.
Pemisahan ini menghasilkan dua state yang berkaitan: thread mask mengendalikan apakah delivery diblokir, sedangkan mask signalfd menentukan signal pending mana yang memenuhi syarat untuk dibaca dari descriptor. Rekonfigurasi signalfd yang sudah ada mengganti mask descriptor, tetapi tidak mengubah thread mask.
SIGKILL dan SIGSTOP tidak dapat diterima melalui signalfd. Memasukkan keduanya ke mask descriptor tidak memberi efek, sesuai status khusus keduanya dalam model signal.
Read mengonsumsi state signal tertunda
Ketika setidaknya satu signal terpilih berada dalam state pending, read(2) mengembalikan sebanyak mungkin record lengkap struct signalfd_siginfo yang muat di buffer. Buffer harus cukup untuk sedikitnya satu record. Signal yang direpresentasikan oleh read yang berhasil dikonsumsi dan tidak lagi pending untuk diterima kemudian oleh signalfd lain, sigwaitinfo(2), atau signal handler.
Properti konsumsi ini penting ketika beberapa objek signalfd memiliki mask yang tumpang tindih. Satu kejadian pending yang cocok dengan lebih dari satu descriptor dapat dikonsumsi melalui salah satunya, tetapi kejadian yang sama tidak diduplikasi ke setiap descriptor yang cocok.
Signal standar dan real-time tetap mengikuti semantik antrean yang sudah berlaku. signalfd mengubah antarmuka penerimaan; mekanisme ini tidak mengganti aturan kernel untuk pembangkitan signal, state pending, coalescing, atau antrean real-time.
Readiness bergabung dengan set I/O biasa
select(2), poll(2), dan epoll(7) dapat melaporkan signalfd sebagai readable ketika state signal terpilih tersedia. SFD_NONBLOCK membuat read saat kosong gagal dengan EAGAIN alih-alih menunggu. SFD_CLOEXEC menetapkan close-on-exec ketika descriptor dibuat.
Dengan sifat ini, proses dapat menempatkan signal bersama socket, pipe, timerfd, dan sumber lain yang dapat dipoll. Antarmuka readiness yang sama tidak membentuk total ordering di antara sumber event independen tersebut. Event loop tetap menentukan kebijakan dispatch dan fairness ketika beberapa descriptor siap secara bersamaan.
Satu read dapat mengembalikan beberapa record, sehingga satu notifikasi readiness tidak identik dengan satu record signal. Perilaku draining bergantung pada mode blocking, kapasitas buffer, dan pending set pada setiap read.
Target thread tetap mengikuti semantik signal
Routing signal tidak berubah menjadi state lokal milik descriptor. Thread yang membaca signalfd dapat menerima signal yang diarahkan ke dirinya sendiri serta process-directed signal yang tersedia bagi thread group, tetapi tidak dapat membaca signal yang secara khusus diarahkan ke thread lain.
Pada program multithreaded, strategi blocking karena itu menjadi bagian dari batas desain. Membuat satu signalfd pada satu thread tidak otomatis membuat signal yang cocok menjadi tidak tersedia bagi handler pada thread lain yang tidak memblokir signal tersebut.
Setelah fork(2), child mewarisi descriptor dan dapat membaca signal yang masuk ke child. Ada batas yang lebih sempit pada epoll(7): signalfd warisan yang sudah ditambahkan ke instance epoll sebelum fork tidak membuat epoll_wait(2) milik child melaporkan readiness untuk signal yang diarahkan ke child. Membuat ulang dan mendaftarkan signalfd setelah fork menghindari ketergantungan pada perilaku registrasi warisan tersebut.
Signal fault sinkron tetap berada di luar mekanisme ini
signalfd sesuai untuk signal yang dibangkitkan secara asinkron dan dapat menjadi pending saat diblokir. Mekanisme ini tidak dapat menggantikan handler untuk signal fault sinkron yang dibangkitkan oleh instruksi yang sedang dieksekusi, seperti SIGSEGV akibat akses memori invalid atau SIGFPE akibat kesalahan aritmetika.
Batasnya dengan demikian spesifik. signalfd mengubah penerimaan signal pending yang memenuhi syarat menjadi I/O descriptor terstruktur, sementara signal mask, pemilihan target, aturan antrean, fault sinkron, dan semantik lifecycle proses tetap menjadi bagian dari subsistem signal Linux.