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建议的那样,我删除了信号处理程序,现在“被信号杀死”正在打印出来。谢谢你的帮助。