SIGCHLD是在Linux上的SIGCONT上发送的,而不是在macOS上发送的
在主要过程中,我听SIGCHLD:
signal(SIGCHLD, &my_handler);
然后我fork()
, execv()
并让它在后台运行(例如/ bin / cat)。
当我尝试从终端向子进程发送SIGSTOP时, my_handler()
。 但是当我尝试向它发送SIGCONT时,处理程序不会在macOS上调用,而是在我的Ubuntu上执行。
人:
SIGCHLD:儿童身份已发生变化。
我错过了什么吗? 这是预期的行为吗? 我在Ubuntu上编写了我的应用程序,并期望它也可以在mac上运行。
我也试过sigaction()
,但结果相同。
这是一个示例代码,用于演示:
#include #include #include #include #include #include void my_handler(int signum) { printf("\t SIGCHLD received\n"); fflush(stdout); } void my_kill(pid_t pid, int signum) { printf("Sending %d\n", signum); fflush(stdout); kill(pid, signum); printf("Sent %d\n\n", signum); fflush(stdout); } int main() { pid_t pid; char *cat_args[2] = {"/bin/cat", NULL}; signal(SIGCHLD, &my_handler); pid = fork(); if (pid == 0) { execv("/bin/cat", cat_args); } else { my_kill(pid, SIGSTOP); my_kill(pid, SIGCONT); wait(NULL); } return 0; }
使用macOS上的输出:
Sending 17 SIGCHLD received Sent 17 Sending 19 Sent 19
这种行为是可选的。 实现不需要在继续时生成SIGCHLD。 POSIX.1-2008(2016年版)中使用的语言是“可能”而不是“应”:
当停止的进程继续时, 可以为其父进程生成SIGCHLD信号,除非父进程已设置SA_NOCLDSTOP标志。
– 系统接口,2.4.3信号动作
…只要其任何已停止的子进程继续,就可以为调用进程生成SIGCHLD信号。
– 系统接口sigaction
“描述”
重点补充说。
我错过了什么吗?
可能不是。
这是预期的行为吗?
可能是。
OSX基于4.4 BSD,并且该BSD不支持在孩子继续时向父母发送SIGCHLD
。 早期版本的Linux也缺乏这种支持。