PR_SET_PDEATHSIG Mengikat Notifikasi Child ke Terminasi Thread Parent
PR_SET_PDEATHSIG memungkinkan sebuah process Linux meminta signal ketika thread yang membuatnya berhenti. Mekanismenya memiliki cakupan sempit: ini adalah notifikasi dari kernel yang terikat pada relasi parent, bukan kontrak umum tentang lifetime process dan bukan jaminan bahwa dua process akan berhenti bersamaan.
Batas tersebut penting pada supervisor, launcher, dan helper process. Child dapat bereaksi saat pembuatnya hilang tanpa melakukan polling PID, tetapi identitas parent, waktu pemasangan setting, aturan inheritance, dan transisi credential menentukan batas perilakunya.
Setting dipasang pada process pemanggil
Permintaan dipasang melalui prctl():
if (prctl(PR_SET_PDEATHSIG, SIGTERM) == -1) {
perror("prctl");
exit(EXIT_FAILURE);
}Argumen signal dapat berupa nomor signal yang valid atau nol untuk menghapus setting. Ketika parent yang relevan kemudian berhenti, kernel menghasilkan signal yang telah dikonfigurasi untuk child. Signal tersebut bersifat process-directed, sehingga disposition dan masking signal normal tetap menentukan delivery serta penanganannya.
Jika handler memakai SA_SIGINFO, siginfo_t.si_pid mengidentifikasi process parent yang berhenti. Informasi ini berguna ketika reparenting melalui subreaper membuat lebih dari satu terminasi ancestor memenuhi kondisi selama lifetime child.
PR_SET_PDEATHSIG tidak membuat kelas signal baru. Interface ini meminta signal Linux biasa dihasilkan pada event lifecycle tertentu.
Parent berarti thread yang membuat process
Batas paling penting muncul pada parent multithreaded. Dalam interface ini, parent yang relevan adalah thread yang membuat child, bukan sekadar parent process sebagai satu thread group.
Jika thread pembuat tersebut berhenti melalui pthread_exit(), signal yang dikonfigurasi dapat dihasilkan meskipun thread lain dalam parent process masih berjalan. Software yang menganggap setting ini sama dengan “beri notifikasi saat seluruh parent process hilang” dapat menempelkan makna lifecycle yang keliru pada event tersebut.
Aturan pada level thread ini mengikuti relasi kernel yang dipakai interface. Launcher yang membuat child dari worker thread perlu memperhitungkan lifetime worker thread secara terpisah dari lifetime process launcher.
Pemasangan memiliki race boundary
Notifikasi berlaku untuk terminasi parent setelah setting terpasang. Jika thread parent sudah berhenti sebelum child memasang PR_SET_PDEATHSIG, kernel tidak menghasilkan signal secara retroaktif hanya karena setting kemudian ditambahkan.
Child yang perlu menutup race ini dapat mencatat PID parent sebelum memasang setting, memanggil prctl(), lalu memeriksa kembali relasi parent. Pemeriksaan tersebut adalah koordinasi aplikasi di sekitar interface; PR_SET_PDEATHSIG sendiri tidak membuat urutan pemasangan menjadi atomik dengan pembuatan process.
Perbedaan ini relevan ketika parent dapat berhenti segera setelah fork(). Keberhasilan prctl() menyatakan bahwa setting berhasil dipasang, bukan bahwa parent masih hidup pada setiap titik sebelumnya selama startup child.
fork menghapus setting pada child baru
Setting parent-death signal tidak diwariskan tanpa perubahan melalui fork(). Child yang baru dibuat memulai eksekusi dengan setting ini dalam keadaan kosong.
Perilaku ini mencegah descendant secara diam-diam mewarisi signal lifecycle yang sebenarnya merujuk pada pembuat parent-nya. Code yang melakukan fork lagi dan mengharapkan generasi berikutnya menerima parent-death signal harus memasang setting sendiri pada process tersebut.
Pada execve(), setting biasanya dipertahankan, tetapi ada pengecualian yang berkaitan dengan keamanan. Eksekusi program set-user-ID atau set-group-ID, maupun program dengan file capabilities terkait, menghapus setting sesuai aturan Linux yang terdokumentasi. Perubahan effective atau filesystem user ID dan group ID juga dapat menghapusnya.
Batas tersebut membuat atribut ini tidak cocok dijadikan asumsi tersembunyi melewati transisi privilege arbitrer. Program yang bergantung pada notifikasi setelah perubahan credential perlu memverifikasi state yang sesuai dengan transisi itu.
Subreaper memperpanjang urutan exit yang memenuhi kondisi
Subreaper Linux mengubah proses reparenting untuk orphan. Setelah sebuah process direparent ke ancestor subreaper, terminasi subreaper tersebut berikutnya juga dapat memicu parent-death signal yang dikonfigurasi.
Artinya, sepanjang lifetime process, mekanisme ini dapat merepresentasikan lebih dari satu event original-parent. Service manager yang bertindak sebagai subreaper dapat menjadi parent baru bagi descendant setelah immediate parent berhenti, dan notifikasi parent-death dari kernel mengikuti perilaku reparenting tersebut.
Signal tetap hanya berupa notifikasi. Mekanisme ini tidak melakukan reap pada child, tidak memindahkan exit status, dan tidak menggantikan semantik wait(). Tanggung jawab subreaper dan parent-death signaling menyelesaikan masalah lifecycle yang berbeda meskipun keduanya dapat bertemu pada process tree yang sama.
Mekanisme ini adalah lifecycle edge, bukan jaminan kill
Pemakaian umum adalah meminta SIGTERM atau signal lain agar helper dapat bereaksi ketika pembuatnya hilang. Tindakan akhirnya tetap mengikuti semantik signal. Signal yang diblokir dapat tetap pending, signal yang ditangkap akan menjalankan handler, dan signal yang diabaikan tidak menghasilkan efek terminasi.
Untuk kebijakan containment yang ketat, mekanisme Linux lain mungkin tetap diperlukan sesuai model process. PR_SET_PDEATHSIG menyediakan satu edge yang presisi: signal yang dikonfigurasi dihasilkan ketika thread parent yang relevan, atau subreaper yang kemudian memenuhi kondisi, berhenti.
Nilainya terletak pada batas yang eksplisit. Mekanisme ini menghindari polling PID dan mengikat notifikasi pada parentage yang dipelihara kernel, sementara kebijakan terminasi process, penanganan signal, transisi privilege, dan supervisi yang lebih luas tetap menjadi tanggung jawab mekanisme terpisah.