【发布时间】:2018-01-28 15:25:30
【问题描述】:
在主进程中我监听 SIGCHLD:
signal(SIGCHLD, &my_handler);
然后我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;
}
在 macOS 上输出:
Sending 17
SIGCHLD received
Sent 17
Sending 19
Sent 19
【问题讨论】:
-
printf("\t SIGCHLD received\n"); fflush(stdout);在信号处理程序中?!?!?你是否试图让你的进程陷入僵局?您可以从信号处理程序中安全地调用 only 异步信号安全函数。printf()和fflush()不是异步信号安全的。
标签: c linux macos signals child-process