gpt4 book ai didi

c - SIGCHLD 在 Linux 上通过 SIGCONT 发送,但在 macOS 上不发送

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:26 24 4
gpt4 key购买 nike

在主进程中我听到 SIGCHLD:

signal(SIGCHLD, &my_handler);

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

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

男人:

SIGCHLD: child status has changed.

我错过了什么吗?这是预期的行为吗?我在 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;
}

在 macOS 上的输出:

Sending 17
SIGCHLD received
Sent 17

Sending 19
Sent 19

最佳答案

该行为是可选的。实现不需要在继续时生成 SIGCHLD。 POSIX.1-2008(2016版)中使用的语言是“may”而不是“shall”:

When a stopped process is continued, a SIGCHLD signal may be generated for its parent process, unless the parent process has set the SA_NOCLDSTOP flag.

- System Interfaces, 2.4.3 Signal Actions

...a SIGCHLD signal may be generated for the calling process whenever any of its stopped child processes are continued.

- System Interfaces sigaction "Description"

添加了重点。

关于c - SIGCHLD 在 Linux 上通过 SIGCONT 发送,但在 macOS 上不发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48487935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com