Saya memprogram yang saya tulis di C fork () dari proses anak. Tidak ada proses yang akan berakhir. Jika saya meluncurkan program dari baris perintah dan tekan control-c proses mana yang akan menerima sinyal interupsi?
Mengapa kita tidak mencobanya dan melihatnya? Berikut ini adalah program sepele yang digunakan signal(3)
untuk menjebak SIGINT
proses orang tua dan anak dan mencetak pesan yang mengidentifikasi proses tersebut ketika tiba.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
if (!fork()) {
signal(SIGINT, &child_trap);
sleep(1000);
exit(0);
}
signal(SIGINT, &parent_trap);
sleep(1000);
return 0;
}
Sebut saja itu test.c
. Sekarang kita bisa menjalankannya:
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
Sinyal interupsi yang dihasilkan di terminal dikirim ke grup proses aktif, yang di sini mencakup orang tua dan anak . Anda dapat melihat keduanya child_trap
dan parent_trap
dieksekusi ketika saya menekan Ctrl- C.
Ada diskusi panjang tentang interaksi antara fork
dan sinyal dalam POSIX . Bagian yang paling material di sini adalah:
Sinyal yang dikirim ke grup proses setelah fork () harus dikirim ke orang tua dan anak.
Mereka juga mencatat bahwa beberapa sistem mungkin tidak berperilaku dengan cara yang benar, khususnya ketika sinyal datang sangat dekat dengan waktu fork()
. Mencari tahu apakah Anda menggunakan salah satu dari sistem itu mungkin akan memerlukan membaca kode atau banyak keberuntungan, karena interaksi yang semakin tidak mungkin dalam setiap upaya individu.
Poin berguna lainnya adalah:
kill
) akan dikirimkan hanya untuk proses itu, terlepas dari apakah itu adalah orang tua atau anak.SIGINT
kode (perilaku default).