如何让孩子打印杀死它的信号?

时间:2014-01-07 23:35:30

标签: c linux signals fork posix

我有以下代码,其中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);
    }
  }
}

3 个答案:

答案 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));