C 我如何让孩子打印杀死它的信号?
我有下面的代码,其中父进程创建多个子进程,然后杀死它们。一旦被杀死,我想打印是什么杀死了孩子(在本例中是信号)。然而,代码并没有打印出来。有什么问题吗C 我如何让孩子打印杀死它的信号?,c,linux,signals,fork,posix,C,Linux,Signals,Fork,Posix,我有下面的代码,其中父进程创建多个子进程,然后杀死它们。一旦被杀死,我想打印是什么杀死了孩子(在本例中是信号)。然而,代码并没有打印出来。有什么问题吗 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <sys/types.h> #include <sys
#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);
}
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int i;
静态无效信号处理器(int signo)
{
if(signo==SIGUSR1)
{
printf(“子%d接收到sigusr1\n”,i+1);
}
}
内部主(空)
{
字符buff[50];
智力状态;
if(信号(SIGUSR1,信号处理器)=SIGUSR1)
{
perror(“信号处理错误”);
}
pid_t cpid,计数;
对于(i=0;i<5;i++)
{
cpid=fork();
如果(cpid==0)
{
睡眠(10);
//出口(0);
}
否则,如果(cpid>0)
{
杀死(cpid,SIGUSR1);
智力状态;
int n=waitpid(cpid和status,0);
如果(n!=cpid)
{
佩罗(“错误”);
}
if(WIFSIGNALED(状态))
{/*获取WTERMSIG(状态)*/
printf(“被信号杀死=%d\n”,WTERMSIG(状态));
}
}
其他的
{
perror(“分叉错误:”);
出口(1);
}
}
}
改用,并确保处理正常退出和信号终止:
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 */
}
pid_t pid=fork();
如果(pid==0)
{
出口(0);
}
否则,如果(pid>0)
{
智力状态;
int n=waitpid(pid和status,0);
如果(n!=pid){/*错误*/}
else if(WIFSIGNALED(status)){/*获取WTERMSIG(status)*/}
else if(WIFEXITED(status)){/*获取WEXITSTATUS(status)*/}
}
否则如果(pid<0)
{
/*错误*/
}
从文档中可以看到,wait
将等待任何子级,而不仅仅是当前子级。当然,完全有可能孩子在收到信号之前就正常离开了
您可以通过调用来阻止孩子正常退出,但只有在没有得到处理的情况下,该信号才会杀死孩子。如果信号处理程序返回,
pause
也返回。这是应用程序的实际代码吗
printf("killed by signal=%d\n");
WTERMSIG(status);
如果是,则第二行无效,请尝试将其更改为:
printf("killed by signal=%d\n", WTERMSIG(status));
WIFSIGNALED(stat_val)-如果由于接收到未捕获的信号而终止的子进程返回状态,则评估为非零值
您的信号正在被捕获(当它们在退出之前被接收时)
您还有其他人提到的问题。好吧-我猜在来自父级的终止信号到达之前,子级将以exit(0)终止。应该让孩子们活着,例如,使用sleep(),这样他们就可以在SIGUSR信号到达之前一直在身边。我尝试了,但仍然没有打印这部分:printf(“被信号杀死=%d\n”);WTERMSIG(状态);如何确保孩子仅被信号杀死?@user3015353:使孩子不退出,例如无限期睡眠。@user3015353:或在孩子身上调用
暂停。我让它睡眠更长时间,但它仍然不工作,即它仍然没有打印@duck建议的“被信号杀死…”行,我移除了信号处理器,现在“被信号线杀死”正在打印。谢谢你的帮助。我已经发布了编辑过的版本,请你看看。“被信号杀死”一行仍然没有打印出来正如@duck建议的那样,我删除了信号处理程序,现在“被信号杀死”正在打印出来。谢谢你的帮助。