Sebuah supervisor mencatat PID 1842 untuk satu worker, menunggu event asinkron, lalu mengirim signal. Di antara kedua operasi itu, worker dapat berhenti, di-reap, dan PID numeriknya kemudian dapat menunjuk proses lain. Angkanya masih tampak valid, tetapi identitas yang dirujuk sudah berubah.
Pidfd pada Linux memindahkan kelas kontrol proses ini dari lookup numerik berulang. PID file descriptor merujuk satu proses tertentu dan memberi userspace referensi yang dipertahankan kernel untuk interface seperti pidfd_send_signal(), API polling, serta, dengan pemeriksaan izin tambahan, pidfd_getfd().
PID numerik adalah nama, bukan handle permanen
PID mengidentifikasi task di dalam PID namespace. Fungsinya sebagai identifier tidak membuatnya permanen. Setelah proses berhenti dan kondisi lifecycle terkait mengizinkan penggunaan ulang, kernel dapat memberikan nilai numerik yang sama kepada proses berikutnya.
Kondisi tersebut menciptakan masalah time-of-check to time-of-use ketika software menyimpan PID, memeriksa suatu properti, lalu menjalankan operasi lain berdasarkan PID. Operasi kedua melakukan resolusi angka sekali lagi. Jika state lifecycle berubah pada interval tersebut, lookup dapat mengenai proses berbeda.
Pemeriksaan tambahan terhadap /proc/<pid> dapat mempersempit sebagian kesalahan aplikasi, tetapi tidak mengubah PID numerik menjadi referensi objek. Dokumentasi kernel juga mencatat bahwa descriptor /proc/<pid> yang sudah terbuka tidak mulai beroperasi pada proses baru ketika angka itu digunakan ulang; operasi yang terkait proses lama akan gagal. Pidfd menyediakan interface referensi proses khusus untuk model ini.
pidfd_open mengikat descriptor ke satu proses
pidfd_open(pid, flags) memperoleh file descriptor yang merujuk proses pilihan dari PID yang diberikan. Linux memperkenalkan system call ini pada versi 5.3. Descriptor hasil memiliki close-on-exec, sehingga successful exec tidak meneruskannya secara default.
Properti pentingnya adalah stabilitas identitas setelah akuisisi. Pidfd tidak berubah menjadi referensi ke proses pengganti hanya karena PID numerik didaur ulang. Operasi yang menerima pidfd memakai proses yang direferensikan, bukan melakukan pemilihan baru dari angka PID yang tersimpan.
Akuisisi tetap memiliki batas. pidfd_open() dimulai dengan PID numerik, sehingga pemanggil perlu memperhitungkan perubahan lifecycle sebelum call tersebut selesai. Untuk child yang baru dibuat, Linux menyediakan CLONE_PIDFD melalui interface pembuatan proses agar pembuatan proses dan akuisisi pidfd dapat digabungkan. Dokumentasi pidfd_open() juga menetapkan kondisi yang membuat pembukaan pidfd untuk child hasil fork tetap aman sebelum child tersebut di-reap.
Signaling mendapat identitas stabil, bukan privilege tambahan
pidfd_send_signal() mengirim signal ke proses yang dirujuk pidfd. Nilai keamanannya spesifik: interface ini menghindari race substitusi target yang muncul saat signal hanya memakai PID yang dapat didaur ulang.
Pidfd bukan jalan pintas terhadap pemeriksaan izin. Aturan izin signal tetap berlaku. Kepemilikan descriptor menetapkan proses mana yang dirujuk; hal itu tidak otomatis mengizinkan setiap operasi terhadap proses tersebut.
Jika proses yang dirujuk sudah berhenti, pidfd_send_signal() tidak mengalihkan signal ke proses berikutnya yang kebetulan memiliki PID sama. Operasi gagal dengan ESRCH ketika proses yang direferensikan tidak lagi menjadi target signal yang valid.
Pemisahan antara penamaan stabil dan otorisasi ini penting secara operasional. Service dapat menghilangkan ambiguitas penggunaan ulang PID sambil tetap mengandalkan credential dan pemeriksaan capability Linux untuk operasi terkait.
Polling mengubah state lifecycle menjadi readiness descriptor
Pidfd dapat dipantau dengan poll(), select(), dan epoll(). Terminasi proses dengan demikian dapat masuk ke event loop yang sama dengan socket, pipe, dan descriptor lain.
Sifat ini menghapus ketidakcocokan arsitektural yang umum pada supervisor. PID numerik hanyalah data pasif dan memerlukan mekanisme lifecycle terpisah. Pidfd sekaligus menjadi referensi identitas dan objek yang mengekspos state terminasi melalui readiness descriptor.
Readiness bukan output proses. Pidfd Linux saat ini bukan byte stream; read() tidak menghasilkan record exit. Pengambilan status dan operasi wait tetap mengikuti interface wait serta hubungan proses yang relevan. Pidfd yang merujuk child dapat dipakai dengan waitid() sesuai aturan yang didokumentasikan.
pidfd_getfd melintasi batas otoritas yang lebih kuat
pidfd_getfd() dapat menduplikasi file descriptor dari proses lain ke proses pemanggil. Operasi ini berbeda secara material dari sekadar mengamati terminasi atau memilih target signal. Operasi tersebut dapat memindahkan akses ke objek kernel yang sudah dibuka oleh target.
Linux menerapkan kontrol akses bergaya ptrace pada operasi ini. Pidfd menetapkan identitas proses sumber secara stabil, sementara keputusan otorisasi terpisah menentukan apakah ekstraksi descriptor diizinkan.
Perbedaan tersebut membatasi interpretasi pidfd sebagai capability proses dengan otoritas tanpa batas. Setiap operasi berbasis pidfd tetap memiliki model izinnya sendiri. Identitas stabil menjadi dasar tempat pemeriksaan itu bekerja, bukan penggantinya.
Konteks namespace tetap menentukan akuisisi numerik
PID namespace memengaruhi PID numerik yang terlihat oleh pemanggil. Pidfd yang diperoleh dari PID yang terlihat merujuk objek proses terpilih, tetapi lookup awal tetap berlangsung dalam konteks namespace yang berlaku bagi pemanggil.
Hal ini relevan ketika software kontrol melintasi batas container atau namespace. Pertukaran integer PID mentah dapat mencampur domain identifier tanpa tanda yang jelas. Pertukaran pidfd yang sudah diperoleh mempertahankan proses yang direferensikan pada handoff tersebut, dengan tetap tunduk pada aturan transfer descriptor dan izin spesifik tiap operasi.
Pidfd memperketat satu trust boundary tertentu: identitas proses dipisahkan dari semantik penggunaan ulang nama numerik. Pidfd tidak membekukan state proses, tidak memberi kontrol universal, dan tidak menghapus kebijakan namespace maupun credential. Properti keamanannya lebih sempit: setelah referensi proses diperoleh secara tepat, operasi pidfd berikutnya tidak berpindah target ke proses tak terkait hanya karena angka PID telah didaur ulang.