我有以下代码,其中parent创建多个子进程并在之后终止它们。一旦被杀,我想打印杀死孩子的东西(在这种情况下是信号)。但是,代码不打印。什么似乎是问题?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
int i;
static void signal_handler(int signo)
{
if (signo == SIGUSR1)
{
printf("child %d received sigusr1\n", i + 1);
}
}
int main(void)
{
char buff[50];
int status;
if (signal(SIGUSR1, signal_handler) == SIGUSR1)
{
perror("Signal handling error");
}
pid_t cpid, count;
for (i = 0; i < 5; i++)
{
cpid = fork();
if (cpid == 0)
{
sleep(10);
//exit(0);
}
else if (cpid > 0)
{
kill(cpid, SIGUSR1);
int status;
int n = waitpid(cpid, &status, 0);
if (n != cpid)
{
perror("error");
}
if (WIFSIGNALED(status))
{ /* get WTERMSIG(status) */
printf("killed by signal=%d\n", WTERMSIG(status));
}
}
else
{
perror("Fork error: ");
exit(1);
}
}
}
答案 0 :(得分:1)
WIFSIGNALED(stat_val) - 如果由于收到未捕获的信号而终止的子进程返回状态,则评估为非零值
您的信号被捕获(当它们在退出之前被接收时)。
您还有其他人提到的其他问题。
答案 1 :(得分:0)
请改用waitpid
,并确保处理 正常退出和信号杀死:
pid_t pid = fork();
if (pid == 0)
{
exit(0);
}
else if (pid > 0)
{
int status;
int n = waitpid(pid, &status, 0);
if (n != pid) { /* error */ }
else if (WIFSIGNALED(status)) { /* get WTERMSIG(status) */ }
else if (WIFEXITED(status)) { /* get WEXITSTATUS(status) */ }
}
else if (pid < 0)
{
/* error */
}
从文档中可以看出,wait
将等待任何孩子,而不仅仅是当前的孩子。当然,孩子完全有可能在收到信号之前正常退出。
您可以通过调用pause
来阻止孩子正常退出,但是如果没有处理,该信号将只会杀死孩子。如果信号处理程序返回,pause
也会返回。
答案 2 :(得分:0)
这是您应用的实际代码吗?
printf("killed by signal=%d\n");
WTERMSIG(status);
如果是这样,第二行无效,请尝试将其更改为:
printf("killed by signal=%d\n", WTERMSIG(status));