Gesaan dan skop
PID numerik boleh digunakan semula selepas sesuatu proses keluar, jadi isyarat atau pemeriksaan status yang tertangguh boleh menyasarkan proses yang salah. Linux menyediakan pidfd_open() untuk deskriptor fail yang merujuk kepada sesuatu proses dan pidfd_send_signal() untuk menghantar isyarat kepada proses tersebut. Kemahiran teras ialah pengaturcaraan sistem dan ketepatan kitaran hayat, jadi ini ialah soalan coding.
Perkara yang dinilai oleh penemu duga
Jawapan yang kukuh menerangkan identiti deskriptor, kesediaan poll atau epoll, integrasi waitid, close-on-exec, kebenaran, dan pembersihan. Mereka membezakan pidfd daripada pemegang proses yang memberikan akses tanpa had, mengendalikan perlumbaan fork/exec, dan mentakrifkan tingkah laku untuk keluar, mula semula, tamat masa, dan ranap penyelia. Mereka juga menyebut pengesanan ciri versi kernel dan sandaran (fallback) yang telah diuji.
Soalan untuk dijelaskan terlebih dahulu
- Versi kernel dan ruang nama (namespaces) manakah yang mesti disokong oleh penyelia?
- Adakah ia melancarkan proses anak sendiri, atau melampirkan pada proses sedia ada?
- Adakah ia mesti memerhati status keluar, menghantar isyarat, atau kedua-duanya?
- Bolehkah pekerja membiakkan keturunan (descendants), dan siapakah yang memiliki pembersihan mereka?
- Apakah jaminan tamat masa, mula semula, dan ranap penyelia?
- Adakah sandaran diperlukan pada kernel tanpa sokongan pidfd?
Rangka kerja jawapan 30 saat
“Saya akan mendapatkan pidfd bagi setiap proses yang diuruskan dan menyimpan deskriptor tersebut, bukan sekadar PID numeriknya. Tambahkan deskriptor pada poll atau epoll, gunakan operasi wait yang didokumentasikan untuk mengumpul status, dan panggil pidfd_send_signal() untuk tamat masa atau penutupan. Tetapkan close-on-exec, tutup deskriptor pada setiap laluan terminal, dan anggap kesediaan serta pengumpulan status sebagai satu mesin keadaan (state machine) kitaran hayat. Saya akan menguji penggunaan semula PID, keluar pantas, ralat kebenaran, anak yang difork, pengesanan ciri kernel, dan mula semula penyelia.”
Jawapan langkah demi langkah
Langkah 1: Dapatkan dan miliki deskriptor
Selepas melancarkan atau mencari proses, panggil pidfd_open() jika disokong dan rekodkan deskriptor dalam jadual pemilik. Tandakannya sebagai close-on-exec dan simpan PID numerik hanya untuk log. Jangan serahkan deskriptor kepada pekerja yang tidak berkaitan tanpa pemindahan pemilikan yang jelas.
Langkah 2: Perhatikan peristiwa kitaran hayat
Daftarkan pidfd dengan poll atau epoll. Kesediaan menunjukkan proses yang dirujuk telah keluar; kumpulkan statusnya dengan operasi wait yang sesuai dan kemudian tutup deskriptor. Jangan membuat kesimpulan tentang keaktifan daripada laluan /proc yang basi atau integer PID.
Langkah 3: Hantar isyarat kepada proses yang betul
Gunakan pidfd_send_signal() untuk penamatan anggun (graceful) dan peningkatan (escalation). Kendalikan ralat kebenaran dan ruang nama secara eksplisit. pidfd mengenal pasti proses yang dirujuk walaupun PID numeriknya kemudiannya digunakan semula, tetapi ia tidak menggantikan semakan kebenaran (authorization checks).
Langkah 4: Modelkan mula semula dan keturunan
Wakilkan setiap pekerja sebagai starting, running, stopping, exited, atau failed. Semasa mula semula, cipta pidfd dan rekod generasi yang baharu. Tentukan sama ada keturunan berada dalam kumpulan proses yang sama, cgroup, atau domain pemilikan yang berasingan; jangan sekali-kali menganggap bahawa menghantar isyarat kepada induk akan membersihkan setiap anak.
Langkah 5: Uji batas perlumbaan dan mudah alih
Berikan tekanan pada ujian keluar pantas dan penggunaan semula PID, isyarat serentak dengan keluar, kehabisan deskriptor, ranap penyelia, perubahan ruang nama, dan kernel yang tidak disokong. Bandingkan dengan sandaran yang dihadkan dengan teliti seperti waitpid untuk anak langsung, dan rekodkan jaminan yang tidak dapat disediakan oleh sandaran tersebut.
Contoh jawapan model
“Kecacatan itu berpunca daripada penggunaan integer yang boleh diguna semula sebagai identiti proses. Saya akan menyimpan pidfd bagi setiap pekerja, mendaftarkannya dengan gelung peristiwa (event loop), mengumpul status keluar selepas kesediaan, dan menghantar isyarat melalui pidfd_send_signal() untuk henti anggun dan peningkatan. Pemilikan deskriptor, close-on-exec, kebenaran, dan pembersihan keturunan menjadi peraturan mesin keadaan yang jelas. Setiap mula semula mendapat generasi dan pidfd baharu. Ujian mesti memaksa keluar pantas dan penggunaan semula PID, merangkumi sokongan ruang nama dan kernel, serta mendokumentasikan jaminan yang lebih lemah bagi sandaran anak langsung.”
Kesilapan biasa
- Hanya menyimpan PID numerik → isyarat yang tertangguh berlumba dengan penggunaan semula PID → kekalkan pidfd.
- Meninjau
/procuntuk keaktifan → pemerhatian menjadi lapuk → gunakan kesediaan pidfd dan pengumpulan status. - Menganggap pidfd memintas kebenaran → isyarat masih memerlukan kebenaran → kendalikan ralat kebenaran.
- Membocorkan deskriptor merentasi exec → program yang tidak berkaitan mewarisi pemegang kitaran hayat → tetapkan close-on-exec.
- Hanya mematikan induk → keturunan kekal yatim (orphaned) → takrifkan pemilikan kumpulan atau cgroup.
- Menganggap kesediaan sebagai status lengkap → pengendalian kod keluar tidak lengkap → kumpul dan kekalkan status wait.
Soalan susulan
Soalan susulan 1: Adakah pidfd menghalang penggunaan semula PID?
Ia menyediakan rujukan deskriptor yang stabil kepada proses untuk operasi yang menerima pidfd. PID numerik mungkin digunakan semula, tetapi operasi melalui deskriptor masih merujuk kepada proses asal.
Soalan susulan 2: Bolehkah anda menggunakan pidfd dengan epoll?
Ya, pidfd boleh ditinjau (pollable) untuk pengesanan keluar proses, jadi ia boleh mengambil bahagian dalam gelung peristiwa penyelia bersama-sama paip (pipes), pemasa, dan soket kawalan.
Soalan susulan 3: Bagaimana jika kernel tiada sokongan pidfd?
Kesan keupayaan semasa permulaan dan gunakan sandaran yang didokumentasikan untuk anak langsung, sambil mendedahkan jaminan perlumbaan dan keterlihatan yang lebih lemah dan bukannya berpura-pura ia setara.
Soalan susulan 4: Apakah yang berlaku selepas penyelia dimulakan semula?
Kekalkan metadata pemilikan yang mencukupi untuk menemui semula atau sengaja meninggalkan pekerja, kemudian cipta semula keadaan pemantauan dan pidfd. Jangan sekali-kali mempercayai PID numerik yang disimpan sahaja.