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 SIGINTve 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_trapve - parent_traptuşuna bastığımda idam edildi .CtrlC
Bir yoktur arasındaki etkileşimlerin uzun tartışma forkPOSIX'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 .SIGINTkodu (varsayılan davranış).