Sebuah supervisor mencatat PID worker, menjalankan pekerjaan lain, lalu mengirim sinyal ke nomor tersebut. Jika worker awal sudah berhenti dan kernel menggunakan kembali PID-nya, operasi berikutnya dapat mengenai proses yang berbeda. Nomor itu mengidentifikasi entri dalam PID namespace pada suatu saat; nomor tersebut bukan handle proses yang tahan lama.

Pidfd Linux menambahkan representasi identitas proses dalam bentuk file descriptor. Pidfd yang diperoleh untuk sebuah proses tetap merujuk ke proses tersebut dan tidak dialihkan ketika PID numeriknya didaur ulang. Mekanisme ini mengubah batas identitas untuk supervisi, tetapi tidak memberikan kewenangan luas atas proses yang dirujuk.

Pidfd mempertahankan referensi, bukan masa hidup proses

pidfd_open(pid, 0) meminta kernel memberikan file descriptor yang merujuk ke proses dengan pid tersebut. Setelah dikembalikan, descriptor itu dapat disimpan, dikirim melalui IPC yang mendukung transfer descriptor, dipantau, dan diberikan ke system call yang mendukung pidfd.

Referensi tersebut tetap terkait dengan objek proses yang sama. Penggunaan ulang PID numerik tidak dapat secara diam-diam mengalihkan pidfd yang sudah diperoleh ke proses berikutnya.

Descriptor itu tidak membuat proses terus berjalan. Target dapat berhenti saat pidfd masih terbuka. Perbedaan ini penting bagi supervisor: identitas yang stabil dan liveness proses merupakan dua properti terpisah.

Pidfd juga bukan snapshot kredensial, memori, namespace, atau executable image. Properti tersebut dapat berubah selama proses masih hidup. Properti yang stabil adalah referensi proses itu sendiri.

Akuisisi tetap memiliki batas sebelum descriptor tersedia

pidfd_open() berawal dari PID numerik. Jika perangkat lunak menerima PID melalui kanal yang tidak tepercaya atau tertunda lalu baru memanggil pidfd_open(), target yang terkait dengan nomor tersebut dapat sudah berubah sebelum akuisisi. Pidfd menghapus ambiguitas penggunaan ulang setelah akuisisi berhasil; mekanisme ini tidak mengamankan interval sebelumnya secara retroaktif.

Pembuatan proses dapat menghindari celah itu. clone3() Linux dengan CLONE_PIDFD dapat mengembalikan pidfd untuk child yang baru dibuat sebagai bagian dari operasi pembuatan. Parent yang memakai antarmuka tersebut tidak perlu menemukan kembali child dari PID numerik saja.

Perbedaan ini penting pada process manager. Pidfd yang diperoleh saat pembuatan membentuk kesinambungan langsung dari pembuatan child ke supervisi berikutnya. Pidfd yang dibuka dari nomor yang diberikan kemudian mewarisi asumsi kepercayaan pada nomor tersebut dan waktu penerimaannya.

pidfd_open() juga memiliki kondisi lifecycle terdokumentasi untuk proses yang sudah berhenti. Perangkat lunak yang memerlukan reaping child secara andal perlu memperlakukan akuisisi pidfd, observasi exit, dan operasi wait sebagai satu desain lifecycle, bukan menganggap lookup yang terlambat selalu dapat memulihkan relasi yang sudah hilang.

Polling mengubah exit menjadi state descriptor

Pidfd dapat dipakai dengan poll(), select(), dan epoll(). Saat proses yang dirujuk berhenti, descriptor menjadi readable. Supervisor dapat menggabungkan observasi exit proses dengan event berbasis descriptor lain tanpa memetakan readiness kembali dari PID yang mungkin telah digunakan ulang.

Readability merupakan indikasi exit, bukan output proses. Membaca byte biasa dari pidfd bukan antarmuka untuk mengambil status. Untuk child process, waitid() dengan P_PIDFD dapat memakai pidfd sebagai pemilih target dan memperoleh status wait berdasarkan aturan wait child yang normal.

Perbedaan antara readiness dan reaping tetap penting. Notifikasi poll melaporkan transisi lifecycle. Semantik wait menentukan apakah pemanggil dapat mengambil status child dan melepaskan state zombie terkait. Pidfd tidak mengubah proses yang tidak terkait menjadi child milik pemanggil.

Pemisahan ini juga mencegah jalan pintas arsitektural yang menyamakan identifier proses, notifikasi exit, dan relasi wait. Pidfd menghubungkan operasi tersebut ke satu referensi stabil, sementara setiap operasi tetap mengikuti aturan kernel masing-masing.

Pengiriman sinyal memakai identitas stabil tetapi tetap memeriksa izin

pidfd_send_signal() mengarahkan sinyal melalui pidfd, bukan menyelesaikan PID numerik pada saat pengiriman. Manfaat identitasnya langsung: operasi tidak dapat dialihkan hanya karena nomor PID lama sudah digunakan ulang.

Otorisasi tetap independen. Pemeriksaan izin sinyal masih berlaku sesuai aturan sinyal kernel, termasuk kondisi kredensial dan capability. Memiliki pidfd bukan berarti memiliki izin untuk mengirim sinyal ke target.

Properti ini membuat transfer pidfd sensitif terhadap kebijakan keamanan tanpa menjadikannya kewenangan universal. Penerima pidfd memperoleh referensi stabil yang dapat dipakai pada antarmuka yang mendukungnya, tetapi setiap antarmuka dapat menerapkan pemeriksaan tambahan. Proses penerima memperoleh kemampuan penamaan yang tahan lama, bukan kendali otomatis atas seluruh resource target.

Supervisor perlu memisahkan dua pertanyaan kebijakan: proses mana yang boleh menerima referensi stabil, dan operasi mana yang boleh dilakukan pemegang referensi tersebut. Menyatukan keduanya dapat melebihkan kewenangan yang sebenarnya direpresentasikan descriptor.

Duplikasi descriptor melintasi batas inspeksi yang lebih kuat

pidfd_getfd() dapat menduplikasi file descriptor dari proses yang dirujuk ke proses pemanggil. Descriptor baru merujuk ke open file description dasar yang sama dengan descriptor target, sesuai semantik objek tersebut.

Operasi ini sengaja lebih dibatasi daripada sekadar kepemilikan pidfd. Linux menerapkan pemeriksaan akses bergaya ptrace pada pidfd_getfd(). Pemanggil yang dapat memegang atau menerima pidfd masih dapat ditolak saat mencoba mengakses tabel descriptor target.

Batas ini penting karena descriptor target dapat merepresentasikan file, socket, pipe, namespace, device, atau objek kernel lain yang membawa kewenangan. Identitas proses yang stabil menjawab proses mana yang sedang dituju; identitas itu tidak menentukan apakah pengambilan salah satu descriptornya diizinkan.

Pemisahan yang sama muncul pada keluarga antarmuka pidfd. Descriptor menyediakan kesinambungan identitas, sedangkan operasi yang dipanggil menyediakan aturan otorisasi dan semantiknya sendiri. Memperlakukan pidfd sebagai capability proses universal akan menghapus perbedaan tersebut.

Nomor yang relatif terhadap namespace tetap muncul di tepi sistem

PID numerik ditafsirkan relatif terhadap PID namespace. Sebuah proses dapat memiliki nilai PID terlihat yang berbeda pada level namespace berbeda, dan PID yang bermakna bagi satu observer dapat memiliki konteks berbeda bagi observer lain.

Pidfd mengurangi kebutuhan untuk terus menerjemahkan nomor tersebut setelah akuisisi. Setelah sebuah proses memiliki descriptor, operasi yang mendukung pidfd dapat memakai descriptor secara langsung. Hal ini berguna saat supervisi melintasi batas namespace melalui komponen yang dapat mentransfer descriptor dengan aman.

Pidfd tidak menghapus kebijakan namespace. Operasi pada target tetap dapat bergantung pada kredensial, capability, relasi namespace, dan keputusan Linux Security Module. Pidfd hanya mengganti lookup numerik berulang dengan referensi kernel yang stabil.

Transfer descriptor juga menambahkan batas kepercayaannya sendiri. Penerima perlu memercayai komponen yang memasok pidfd jika kebijakannya bergantung pada proses yang dirujuk. Kernel mempertahankan identitas target descriptor; kernel tidak memberikan atestasi bahwa pengirim memilih target yang dimaksud.

Penamaan stabil mempersempit satu race tanpa menyatukan lapisan kebijakan

Pidfd menangani failure mode spesifik dalam manajemen proses: integer yang dapat digunakan ulang merupakan token identitas jangka panjang yang rapuh. Mengubah identitas proses menjadi file descriptor membuat Linux dapat mengikat operasi berikutnya ke objek proses yang sama dan mengintegrasikan observasi lifecycle dengan event loop berbasis descriptor.

Jaminan itu tetap sempit. Pidfd tidak membekukan state proses, memperpanjang masa hidup proses, membuat relasi child, melewati pemeriksaan sinyal, atau mengizinkan ekstraksi descriptor. Akuisisi dari PID numerik masih dapat membawa race sebelum akuisisi, sedangkan akuisisi pada saat pembuatan melalui CLONE_PIDFD dapat menghindari celah khusus tersebut.

Arsitektur yang dihasilkan lebih kuat ketika identitas dan kewenangan tetap terpisah. Pidfd membuat referensi identitas tahan lama; kebijakan sinyal, pemeriksaan inspeksi bergaya ptrace, aturan wait child, namespace, dan kebijakan LSM tetap menentukan tindakan yang benar-benar boleh dilakukan pemegang referensi tersebut.