SIGCHLD是在Linux上的SIGCONT上发送的,而不是在macOS上发送的

Emi*_*man 1 c linux macos signals child-process

在主要过程中,我听SIGCHLD:

signal(SIGCHLD, &my_handler);
Run Code Online (Sandbox Code Playgroud)

然后我fork(),execv()让它在后台运行(例如/ bin/cat).

当我尝试从终端发送SIGSTOP到子进程时,my_handler()被调用.但是当我尝试向它发送SIGCONT时,处理程序不会在macOS上调用,而是在我的Ubuntu上执行.

人:

SIGCHLD:儿童身份发生了变化.

我错过了什么吗?这是预期的行为吗?我在Ubuntu上编写了我的应用程序,并期望它也可以在mac上运行.

我也尝试过sigaction(),但结果相同.

这是一个示例代码,用于演示:

#include <signal.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

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;
}
Run Code Online (Sandbox Code Playgroud)

使用macOS上的输出:

Sending 17
         SIGCHLD received
Sent 17

Sending 19
Sent 19
Run Code Online (Sandbox Code Playgroud)

pil*_*row 5

这种行为是可选的.实现不需要在继续时生成SIGCHLD.POSIX.1-2008(2016年版)中使用的语言是"可能"而不是"应":

当停止的进程继续时,可以为其父进程生成SIGCHLD信号,除非父进程已设置SA_NOCLDSTOP标志.

- 系统接口,2.4.3信号动作

......一个SIGCHLD信号每当任何停止子进程得以持续的呼叫过程中产生.

- 系统接口sigaction"描述"

重点补充说.