Jika proses induk dan anak berada di bawah kendali Anda seumur hidup, metode yang paling portabel adalah berbagi separuh pipa atau soket dengan induk.
- Sebelum fork, buka pipe() atau socketpair().
- Setelah garpu,
- di induk, tutup ujung baca pipa, atau soket pertama.
- di anak, tutup ujung tulis pipa, atau soket kedua.
- Di induknya, simpan deskriptor file yang tersisa dan lupakan.
- Pada anak, gunakan salah satu metode IO multipleks (pilih, jajak pendapat, dll.) untuk menguji deskriptor untuk keterbacaan
- Jika deskriptor dapat dibaca, induknya hampir pasti mati, atau beberapa bug langka menyebabkan penulisan yang menyimpang, yang dapat Anda periksa dengan memanggil read(). Jika induknya benar-benar mati, read() akan mengembalikan 0 byte.
Keuntungan dari metode ini adalah sepenuhnya menghindari sinyal, yang merupakan salah satu mekanisme yang paling sulit dikuasai di UNIX, dan menyediakan deskriptor yang dapat ditunggu yang dapat dengan mudah diintegrasikan dengan multiplexer jaringan atau loop kejadian GUI.
Anda bisa mendapatkan id proses induk dengan memanggil getppid()
dan kemudian mengirimkan sinyal 0 melalui kill()
. Kode pengembalian 0 akan menunjukkan bahwa prosesnya masih hidup.
Seperti yang disebutkan oleh @Ariel, getppid()
akan mengembalikan pid dari induk asli atau init, yang akan menjadi pid 1. Jadi, Anda harus menyimpan pid induk dengan memanggil getppid()
saat memulai atau nanti, periksa apakah orang tua Anda memiliki pid 1.
Menurut jawaban ini di Linux Anda juga dapat mendeteksi kematian orang tua melalui prctl()
PR_SET_PDEATHSIG
opsi dan sinyal yang dipilih sendiri.