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.