Di BSD dan OS X, Anda dapat menggunakan kqueue dengan EVFILT_PROC+NOTE_EXIT untuk melakukan hal itu. Tidak diperlukan pemungutan suara. Sayangnya tidak ada yang setara dengan Linux.
Anda juga dapat membuat soket atau FIFO dan membacanya. FIFO sangat sederhana:Hubungkan keluaran standar anak Anda dengan FIFO dan baca. Bacaan akan diblokir hingga anak keluar (untuk alasan apa pun) atau hingga memancarkan beberapa data. Jadi, Anda memerlukan sedikit putaran untuk membuang data teks yang tidak diinginkan.
Jika Anda memiliki akses ke sumber anak, buka FIFO untuk menulis saat dimulai dan kemudian lupakan saja. OS akan membersihkan deskriptor file yang terbuka saat anak berhenti dan proses "induk" Anda yang menunggu akan aktif.
Sekarang ini mungkin proses yang tidak Anda mulai atau miliki. Dalam hal ini, Anda dapat mengganti biner yang dapat dieksekusi dengan skrip yang memulai biner asli tetapi juga menambahkan pemantauan seperti yang dijelaskan di atas.
Sejauh ini saya telah menemukan tiga cara untuk melakukannya di Linux:
- Polling:Anda sering memeriksa keberadaan proses, baik dengan menggunakan
kill
atau dengan menguji keberadaan/proc/$pid
, seperti pada sebagian besar jawaban lainnya - Gunakan
ptrace
panggilan sistem untuk melampirkan ke proses seperti debugger sehingga Anda mendapat pemberitahuan saat keluar, seperti pada jawaban a3nm - Gunakan
netlink
antarmuka untuk mendengarkanPROC_EVENT_EXIT
pesan - dengan cara ini kernel memberi tahu program Anda setiap kali proses keluar dan Anda hanya menunggu ID proses yang benar. Saya hanya melihat ini dijelaskan di satu tempat di internet.
Steker tak tahu malu:Saya sedang mengerjakan sebuah program (sumber terbuka tentu saja; GPLv2) yang melakukan salah satu dari ketiganya.
Tidak ada yang setara dengan wait()
. Praktik yang biasa dilakukan adalah polling menggunakan kill(pid, 0)
dan mencari nilai kembalian -1 dan errno
dari ESRCH
untuk menunjukkan bahwa proses tersebut telah hilang.
Perbarui: Sejak kernel linux 5.3 ada syscall pidfd_open, yang membuat fd untuk pid tertentu, yang dapat disurvei untuk mendapatkan notifikasi ketika pid telah keluar.