我用C fork()编写的程序是由子进程编写的。这两个过程都不会终止。如果我从命令行启动程序并按Ctrl-c,哪个进程将收到中断信号?
我用C fork()编写的程序是由子进程编写的。这两个过程都不会终止。如果我从命令行启动程序并按Ctrl-c,哪个进程将收到中断信号?
Answers:
我们为什么不试试看呢?这是一个微不足道的程序,signal(3)
用于捕获SIGINT
父进程和子进程,并在消息到达时打印出标识该进程的消息。
#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;
}
让我们称之为test.c
。现在我们可以运行它:
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
终端中生成的中断信号将传递到活动进程组,该进程组在此既包括父进程,也包括子进程。当我按- 时,您可以看到child_trap
和parent_trap
都已执行。CtrlC
在POSIX中对fork
和信号之间的交互进行了冗长的讨论。这里最重要的部分是:
在fork()之后发送到进程组的信号应同时传递给父级和子级。
他们还注意到,某些系统可能无法以完全正确的方式运行,特别是当信号到达的时间非常接近的时间时fork()
。弄清楚您是否使用这些系统之一,可能需要阅读代码或非常幸运,因为每次单独尝试的交互都几乎不会消失。
其他有用的点是:
kill
)将被递送仅到该过程中,无论它是否是父或子。SIGINT
代码(默认行为)。