GNU/Linux >> Belajar Linux >  >> Linux

Proses anak menerima SIGINT orang tua

Jika Anda membuat SIGINT dengan Ctrl +C pada sistem Unix, lalu sinyal dikirim ke seluruh grup proses.

Anda perlu menggunakan setpgid atau setsid untuk menempatkan proses anak ke dalam grup proses yang berbeda sehingga tidak akan menerima sinyal yang dihasilkan oleh terminal pengendali.

[Sunting:]

Pastikan untuk membaca bagian RASIONALE dari setpgid halaman dengan hati-hati. Agak sulit untuk menyambungkan semua potensi kondisi balapan di sini.

Untuk menjamin 100% tidak ada SIGINT akan dikirimkan ke proses anak Anda, Anda perlu melakukan sesuatu seperti ini:

#define CHECK(x) if(!(x)) { perror(#x " failed"); abort(); /* or whatever */ }
/* Block SIGINT. */
sigset_t mask, omask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
CHECK(sigprocmask(SIG_BLOCK, &mask, &omask) == 0);

/* Spawn child. */
pid_t child_pid = fork();
CHECK(child_pid >= 0);
if (child_pid == 0) {
    /* Child */
    CHECK(setpgid(0, 0) == 0);
    execl(...);
    abort();
}
/* Parent */
if (setpgid(child_pid, child_pid) < 0 && errno != EACCES)
    abort(); /* or whatever */
/* Unblock SIGINT */
CHECK(sigprocmask(SIG_SETMASK, &omask, NULL) == 0);

Sebenarnya, setiap langkah ini diperlukan. Anda harus memblokir sinyal jika pengguna menekan Ctrl +C tepat setelah panggilan ke fork . Anda harus memanggil setpgid pada anak dalam hal execl terjadi sebelum orang tua punya waktu untuk melakukan apa pun. Anda harus menelepon setpgid di induk dalam hal induk berjalan dan seseorang menekan Ctrl +C sebelum anak punya waktu untuk melakukan apa saja.

Urutan di atas kikuk, tetapi menangani 100% kondisi balapan.


Linux
  1. Proses Induk Baru Ketika Proses Induk Meninggal?

  2. Mengapa Proses Pgid Anak Bukan Pid Orang Tua?

  3. Mengapa Sigint Tidak Dipropagasi ke Proses Anak Saat Dikirim ke Proses Induknya?

  1. Proses UNIX / Linux:C fork() Fungsi

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

  3. Secara terprogram dapatkan induk pid dari proses lain?

  1. Bagaimana Membunuh Proses Yang Induknya Init?

  2. Bash:Mengapa skrip induk tidak berhenti di SIGINT saat skrip anak menjebak SIGINT?

  3. Cara mematikan proses <defunct> dengan induk 1