PID numerik menamai proses melalui lookup dalam namespace. Nomor tersebut dapat dipakai kembali setelah proses berakhir dan sudah di-reap. PID file descriptor pada Linux mengubah batas ini: sebuah pidfd adalah file descriptor yang merujuk ke task tertentu, sehingga operasi berikutnya dapat menargetkan referensi tersebut tanpa melakukan resolusi PID numerik lagi.

Perilaku manajemen proses ini khusus Linux. Perilaku tersebut bukan properti identifier proses POSIX ataupun bahasa C.

PID numerik adalah nama, bukan handle permanen

Jalur kontrol yang umum menyimpan PID, menunggu kondisi eksternal, lalu memanggil kill(pid, sig). Kedua operasi itu terpisah oleh waktu. Jika proses awal telah berakhir dan PID-nya sudah didaur ulang sebelum operasi signal, lookup numerik baru dapat menunjuk proses yang berbeda.

Pemeriksaan keberadaan dengan kill(pid, 0) tidak membuat kill(pid, sig) berikutnya merujuk ke proses yang sama. Setiap operasi melakukan lookup sendiri. Jeda antara pemeriksaan dan aksi berikutnya membuat identitas proses bergantung pada state saat lookup berikutnya berlangsung.

pidfd mengubah protokol berbasis nama ini menjadi protokol berbasis handle. pidfd_open(pid, 0) meminta kernel membuat descriptor yang merujuk ke task yang saat itu ditunjuk oleh pid. Setelah berhasil, operasi yang mendukung pidfd memakai descriptor tersebut sebagai referensi identitas.

int pfd = syscall(SYS_pidfd_open, pid, 0);
if (pfd == -1)
    /* tangani kegagalan lookup */;

if (syscall(SYS_pidfd_send_signal, pfd, SIGTERM, NULL, 0) == -1)
    /* tangani kegagalan signaling */;

pidfd_open() awal tetap melakukan resolusi PID numerik. Properti stabil mulai berlaku setelah descriptor berhasil diperoleh; properti itu tidak membuat proses penemuan PID sebelumnya bebas race secara retroaktif.

Lifetime descriptor dan lifetime proses tetap terpisah

Memegang pidfd tidak mempertahankan proses target agar terus berjalan. Target dapat berakhir saat descriptor masih terbuka. Descriptor mempertahankan referensi yang dapat dipakai untuk operasi proses yang didukung dan observasi lifecycle, bukan lease atas eksekusi proses.

Perbedaan ini tampak melalui polling. pidfd yang merujuk proses dapat digunakan dengan poll(), select(), atau epoll(). Ketika task yang dirujuk berakhir dan menjadi zombie, descriptor melaporkan state readable. Setelah task di-reap, polling juga menampilkan state hangup sesuai semantik pidfd Linux.

Descriptor tersebut bukan byte stream. read() biasa pada pidfd bukan mekanisme untuk mengambil record exit. Readiness menunjukkan state lifecycle; status proses diperoleh melalui interface seperti waitid() ketika relasi proses dan syarat kelayakannya terpenuhi.

Signaling memakai identitas tanpa lookup PID berulang

pidfd_send_signal() mengarahkan signal ke proses atau thread yang dirujuk pidfd, dengan tetap mengikuti pemeriksaan permission dan namespace Linux. Mekanisme ini menghapus race identitas yang muncul ketika PID numerik dibawa melewati jeda waktu lalu di-resolve kembali untuk signaling.

Pemanggilan tersebut tidak melonggarkan otorisasi signal. Referensi stabil menentukan task yang menjadi target; credentials, capabilities, PID namespaces, dan aturan khusus signal tetap menentukan apakah operasi diizinkan.

Kegagalan setelah target berakhir juga memiliki arti yang jelas. pidfd dapat tetap terbuka setelah task hilang, tetapi pidfd_send_signal() tidak dapat mengirim signal ke task yang sudah tidak ada. Identitas stabil mencegah penargetan ulang secara tidak sengaja; identitas tersebut tidak membuat task yang sudah berakhir menjadi penerima signal yang valid.

Waktu pembuatan menentukan race yang masih tersisa

Untuk proses yang sudah ada, pidfd_open() merupakan interface akuisisi langsung. Tetap ada batas lookup antara memperoleh PID numerik dari suatu sumber dan berhasil membuka pidfd. Software yang membuat child sendiri dapat memakai clone() atau clone3() dengan CLONE_PIDFD ketika sesuai, sehingga pembuatan proses dan perolehan pidfd terjadi melalui satu operasi kernel.

Perbedaan itu penting bagi supervisor. Desain yang membuat child dan segera memerlukan referensi proses permanen dapat menghindari publikasi PID polos sebagai capability kontrol utama. Desain yang menempel pada proses yang ditemukan secara independen tetap perlu memperlakukan discovery dan akuisisi descriptor sebagai dua fase berbeda.

pidfd_open() juga memiliki kondisi lifecycle terkait child yang sudah berakhir. Kode yang memerlukan perilaku pembuatan dan reaping child secara presisi sebaiknya memilih akuisisi pidfd saat pembuatan, bukan menganggap setiap zombie selalu dapat dikonversi kemudian menjadi handle yang setara.

Aturan file descriptor kini berlaku pada referensi proses

Setelah identitas proses direpresentasikan sebagai descriptor, ownership descriptor menjadi bagian dari desain kontrol proses. pidfd memakai satu slot file descriptor, dapat ditutup, dapat diteruskan melalui mekanisme descriptor passing ketika diizinkan, dan dibuat dengan close-on-exec aktif oleh pidfd_open().

Representasi tersebut juga memungkinkan event loop menggabungkan terminasi proses dengan readiness descriptor lain. Supervisor dapat mendaftarkan pidfd bersama socket, pipe, signalfd, atau timerfd tanpa mengubah exit proses menjadi loop polling PID numerik terpisah.

Readiness descriptor tidak berarti semua operasi proses berubah menjadi I/O biasa. Interface seperti pidfd_send_signal(), pidfd_getfd(), waitid(), setns(), dan process_madvise() tetap memiliki kontrak dan pemeriksaan permission masing-masing. pidfd menyediakan pembawa identitas bersama, sedangkan setiap operasi menetapkan semantiknya sendiri.

Identitas stabil mempersempit kelas race kontrol tertentu

Daur ulang PID merupakan persoalan penamaan yang muncul ketika nomor yang dapat dipakai ulang diperlakukan sebagai referensi objek permanen. PID file descriptor menangani persoalan itu dengan memungkinkan Linux mengikat operasi berikutnya ke task yang dipilih saat descriptor diperoleh.

Batas mekanisme ini sengaja lebih sempit daripada transaksi proses umum. pidfd tidak membekukan credentials, menserialkan transisi lifecycle, mempertahankan task agar tetap hidup, atau membuat rangkaian supervisi arbitrer menjadi atomik. pidfd menyediakan handle identitas stabil, lalu signaling, waiting, polling, dan operasi lain yang didukung dapat menerapkan kontraknya masing-masing tanpa lookup PID numerik tambahan.