GNU/Linux >> Belajar Linux >  >> Linux

Mendeteksi kematian proses induk

Jika proses induk dan anak berada di bawah kendali Anda seumur hidup, metode yang paling portabel adalah berbagi separuh pipa atau soket dengan induk.

  1. Sebelum fork, buka pipe() atau socketpair().
  2. Setelah garpu,
    1. di induk, tutup ujung baca pipa, atau soket pertama.
    2. di anak, tutup ujung tulis pipa, atau soket kedua.
  3. Di induknya, simpan deskriptor file yang tersisa dan lupakan.
  4. Pada anak, gunakan salah satu metode IO multipleks (pilih, jajak pendapat, dll.) untuk menguji deskriptor untuk keterbacaan
  5. 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.


Linux
  1. Proses Induk Baru Ketika Proses Induk Meninggal?

  2. Proses Substitusi Dan Pipa?

  3. Bagaimana Membunuh Proses Yang Induknya Init?

  1. Deteksi Proses Makan Cpu Tanpa :Top, Htop, Ps?

  2. Bagaimana cara membuat proses anak mati setelah orang tua keluar?

  3. Apakah mungkin mengubah Lingkungan dari proses induk dengan Python?

  1. Secara terprogram dapatkan induk pid dari proses lain?

  2. Bagaimana cara mendapatkan nilai pengembalian dari PROSES ANAK?

  3. Cara membunuh proses zombie