PID Linux adalah angka dari namespace yang dapat digunakan ulang. pidfd berbeda: ia adalah file descriptor yang merujuk ke proses tertentu. Perbedaan itu mengubah pengelolaan proses dari lookup berulang berdasarkan nama numerik menjadi operasi terhadap handle yang dipertahankan kernel dan identitasnya tidak diam-diam berpindah ketika PID didaur ulang.

Perbedaannya paling terlihat pada supervisor, launcher, sandbox, dan service manager yang mempertahankan referensi proses melintasi pekerjaan asynchronous. PID numerik dapat tetap valid secara sintaksis setelah proses asli keluar, tetapi kemudian mengidentifikasi proses lain. pidfd menjaga referensi tetap terikat pada objek proses asli dan juga dapat berpartisipasi dalam event loop berbasis descriptor.

PID numerik adalah nama, bukan capability yang tahan lama

PID mengidentifikasi proses dalam PID namespace selama proses tersebut menempati angka itu. Setelah terminasi proses dan transisi lifecycle yang relevan, kernel pada akhirnya dapat menggunakan ulang angka tersebut untuk proses lain.

Reuse itu menciptakan boundary time-of-check bagi kode yang hanya menyimpan PID. Bayangkan komponen yang mengamati PID 4120, menunggu event lain yang tidak terkait, lalu mengirim signal ke 4120. Jika target asli sudah keluar dan angka itu digunakan ulang dalam interval tersebut, lookup baru berdasarkan PID dapat merujuk ke proses berbeda.

Kode tradisional mengurangi risiko ini melalui disiplin lifecycle: mempertahankan relasi parent-child, segera me-reap child, memeriksa metadata proses tambahan, atau mengatur serialisasi di sekitar pembuatan proses dan signaling. Teknik tersebut dapat valid dalam kondisi tertentu, tetapi tidak mengubah properti inti identifier. Integer itu tetap merupakan nama namespace yang asosiasinya memiliki lifetime.

pidfd memindahkan boundary identitas. Setelah diperoleh untuk suatu proses, descriptor merujuk pada proses tersebut alih-alih meminta kernel menyelesaikan PID numerik lagi untuk setiap operasi yang didukung.

Akuisisi handle menetapkan target pada satu titik waktu

Linux menyediakan pidfd_open() untuk memperoleh pidfd bagi proses yang sudah ada. Pemanggilan yang berhasil menyelesaikan PID yang diberikan pada waktu akuisisi dan mengembalikan file descriptor yang merujuk pada proses tersebut.

Hal itu tidak membuat akuisisi bebas race pada setiap desain. Jika kode terlebih dahulu memperoleh PID melalui satu channel dan memanggil pidfd_open() kemudian, target dapat keluar di antara kedua tindakan. Syscall kemudian dapat gagal, atau protokol di sekitarnya masih membutuhkan jaminan creation-time yang lebih kuat.

Properti yang berguna dimulai setelah akuisisi berhasil: operasi pidfd berikutnya menggunakan referensi proses yang sudah ditetapkan. PID reuse tidak mengarahkan ulang descriptor ke proses berikutnya yang menerima angka sama.

Untuk child yang baru dibuat, Linux juga menyediakan jalur creation yang dapat mengembalikan pidfd sebagai bagian dari pembuatan proses, seperti clone3() dengan flag yang relevan. Menggabungkan creation dan pengembalian handle menghapus interval akuisisi PID-ke-pidfd yang terpisah pada jalur tersebut.

Klaim ini lebih sempit daripada mengatakan pidfd menghapus seluruh race proses. pidfd menghapus satu kelas race identitas: resolusi berulang identifier numerik yang dapat digunakan ulang setelah handle proses yang stabil berhasil diperoleh.

Signaling dapat menggunakan handle tanpa lookup PID lain

pidfd_send_signal() mengirim signal melalui pidfd. Targetnya adalah proses yang dirujuk descriptor, bukan proses mana pun yang kebetulan memiliki PID numerik tersimpan saat itu.

Perbedaan semantik ini bernilai ketika signaling terjadi lama setelah discovery. Queue dapat membawa pidfd, atau komponen pemilik dapat mempertahankannya, tanpa perlu konversi kembali menjadi PID hanya untuk mengalamatkan signal.

Permission tetap berlaku. Memiliki pidfd tidak memberikan otoritas tanpa batas untuk mengirim signal ke target. Kernel menjalankan pemeriksaan permission yang berlaku untuk operasi tersebut. Referensi identitas yang stabil dan authorization adalah properti terpisah.

Pemisahan yang sama penting untuk failure handling. Proses dapat keluar sebelum signal dikirim. pidfd mencegah pengalihan tidak sengaja ke proses pengganti, tetapi tidak dapat membuat target yang sudah keluar menerima signal. Identitas stabil mengubah ambiguitas berbahaya menjadi operasi dengan semantik lifecycle proses; ia tidak mempertahankan liveness target.

Process exit menjadi kompatibel dengan polling descriptor

pidfd dapat dipantau dengan interface seperti poll(), select(), dan epoll. Untuk process leader, readiness dapat menunjukkan bahwa proses telah berhenti.

Hal ini memberi observasi lifecycle proses bentuk event-delivery yang sama dengan socket, pipe, eventfd, dan sumber berbasis descriptor lainnya. Reactor dapat menunggu terminasi proses tanpa mendedikasikan seluruh control flow pada operasi wait yang blocking.

Polling pidfd tidak identik dengan me-reap child. Jika target adalah child yang status terminasinya harus dikumpulkan, aplikasi tetap membutuhkan semantik wait yang sesuai. Linux menyediakan dukungan waitid() untuk pidfd pada sistem dengan interface yang relevan, sehingga handle stabil juga dapat berpartisipasi dalam pengumpulan status.

Perbedaannya bersifat struktural: readiness melaporkan kondisi lifecycle melalui interface descriptor, sedangkan operasi wait mengatur observasi status child dan reaping. Memperlakukan readiness saja sebagai cleanup universal dapat meninggalkan kewajiban pengelolaan proses yang belum selesai.

Lifetime file descriptor dan proses berbeda

Menutup pidfd melepaskan referensi descriptor tersebut. Tindakan itu tidak menghentikan proses yang dirujuk. Demikian pula, terminasi proses tidak membuat nomor descriptor langsung menjadi referensi ke proses masa depan.

Ini mencerminkan properti handle Unix yang umum: menutup handle memengaruhi referensi milik caller, bukan lifecycle independen objek di bawahnya kecuali interface secara eksplisit mendefinisikan coupling seperti itu.

Aturan inheritance descriptor juga penting. pidfd tetap merupakan file descriptor, sehingga kode harus memperhitungkan state close-on-exec, duplication, transfer, batas descriptor table, dan konvensi ownership. Identitas proses lebih stabil daripada PID mentah, tetapi handle membawa tanggung jawab lifecycle descriptor biasa.

Meneruskan pidfd melalui Unix domain socket dapat mentransfer referensi proses di antara komponen yang bekerja sama ketika kernel dan interface mendukungnya. Transfer tersebut mengubah komponen mana yang memegang handle; ia tidak melewati permission pada operasi berikutnya.

Boundary namespace tetap terlihat

PID diinterpretasikan relatif terhadap PID namespace, dan satu proses dapat memiliki nilai PID numerik berbeda ketika diamati dari level namespace yang berbeda. pidfd menghindari kebutuhan setiap operasi berikutnya untuk merekonstruksi view numerik yang benar setelah handle diperoleh.

Hal itu tidak menghapus kebijakan namespace. Akuisisi itu sendiri harus mengidentifikasi proses yang terlihat melalui konteks namespace caller yang berlaku, dan operasi tetap tunduk pada access control kernel.

Properti ini membuat pidfd berguna pada interface boundary ketika identifier numerik sulit dipertahankan dengan aman. Handle dapat membawa identitas objek melintasi waktu tanpa mengklaim PID numerik memiliki makna global.

Identitas stabil mempersempit failure mode

Desain kontrol proses yang hanya berbasis PID sering menggabungkan dua pertanyaan dalam satu integer: proses mana yang awalnya dipilih, dan proses mana yang saat ini menempati slot namespace tersebut. Kedua pertanyaan memiliki jawaban sama hanya selama asosiasi PID tidak berubah.

pidfd memisahkan keduanya. Descriptor merekam identitas proses yang dipilih, sementara operasi lifecycle melaporkan apa yang terjadi pada proses tersebut. Jika proses keluar, handle tetap menunjuk target yang sudah keluar untuk semantik yang didukung interface, bukan bergeser ke pengganti.

Hal itu mengubah analisis error. Dengan PID mentah, signaling tertunda harus memperhitungkan salah identitas setelah reuse. Dengan pidfd yang berhasil diperoleh, kasus relevan beralih ke target exit, kegagalan permission, operasi yang tidak didukung, descriptor closure, dan resource exhaustion. PID reuse tidak lagi mengarahkan ulang handle.

Karena itu pidfd cocok untuk sistem yang membutuhkan referensi proses tahan lama melintasi boundary asynchronous. Kontribusi utamanya bukan scheduler proses baru atau permission model baru. Ia merupakan primitive identitas yang lebih kuat: nomor namespace yang dapat digunakan ulang diselesaikan sekali menjadi file descriptor, dan operasi berikutnya yang didukung mempertahankan asosiasi proses tersebut.