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也缺乏这种支持。