C fork () 'a yazdığım bir programın alt sürecinden çıkıyorum. Her iki süreç de sona ermeyecektir. Programı komut satırından başlatır ve control-c tuşlarına basarsam hangi süreç (ler) kesme sinyalini alır?
C fork () 'a yazdığım bir programın alt sürecinden çıkıyorum. Her iki süreç de sona ermeyecektir. Programı komut satırından başlatır ve control-c tuşlarına basarsam hangi süreç (ler) kesme sinyalini alır?
Yanıtlar:
Neden denemiyor ve görmüyoruz? Hem üst hem de alt süreci signal(3)
yakalamak SIGINT
ve geldiğinde süreci tanımlayan bir mesaj yazdırmak için kullanılan önemsiz bir program .
#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;
}
Diyelim ki test.c
. Şimdi çalıştırabiliriz:
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
Terminalde üretilen kesme sinyalleri burada hem ebeveyn hem de alt öğeyi içeren aktif işlem grubuna iletilir . Her ikisini de görebilirsiniz child_trap
ve - parent_trap
tuşuna bastığımda idam edildi .CtrlC
Bir yoktur arasındaki etkileşimlerin uzun tartışma fork
POSIX'deki ve sinyaller . Burada en maddi kısmı şudur:
Çataldan () sonra işlem grubuna gönderilen bir sinyal hem ebeveyne hem de çocuğa iletilmelidir.
Ayrıca bazı sistemlerin özellikle sinyal zamanına çok yaklaştığında tam olarak doğru davranmayabileceğini de not ederler fork()
. Bu sistemlerden birinde olup olmadığınızı anlamak, muhtemelen kodu veya çok fazla şansı okumayı gerektirecektir, çünkü etkileşimlerin her bir denemede kaybolması olası değildir.
Diğer faydalı noktalar:
kill
) gönderilen bir sinyal , ana veya alt öğe olup olmadığına bakılmaksızın yalnızca bu işleme iletilir .SIGINT
kodu (varsayılan davranış).