C我相信我的孩子过程死得太快而无法运行我的信号?

时间:2014-12-20 12:45:40

标签: c process

这里有点奇怪的情况,我以为我用报警信号解决了。我有一个父母要求孩子。现在在这个子进程中,我希望它能够识别" SIGTSTP"捕捉控制+ z的信号。

为了防止孩子立即死亡,我发出了一个警报(5)信号,让它继续运行一段时间。孩子也有召唤Control + Z SIGNAL。我面临的问题是,当我在编译之后到达该特定代码的运行时,我按下控制Z并且我按预期从处理程序获得结果但是我也进入终端:

[9]+ Stopped ./a.out

我似乎无法再次按下控制Z,但似乎没有任何工作......最终警报到期并且代码刚刚完成执行?如果我将控制器Z的处理程序放在父进程中,那么它运行正常。

fork2 = fork();

    if (fork2 < 0)
    {
      write(2, "CHILD B FORK ERROR. \n", 21);
    }
    else if (fork2 == 0)
    {
      signal(SIGALRM, handleSignal);
          if (signal(SIGTSTP, handleSignal) == SIG_ERR)
        {
          write(2, "Error catching signal Z \n", 26);
        }
      write(1, "I am child of B \n", 17);

      alarm(5);
    }
    else
    {
        // where parent code is
    }

1 个答案:

答案 0 :(得分:1)

我认为你误解了alarm(2)的工作原理。警报不是阻止呼叫,也不会使您的子进程保持更长时间。我建议您使用sleep(3)代替睡眠阻滞x秒或直到信号到达而不被忽略。我会写这样的(未经测试的,未编译的代码):

fork2 = fork();

if (fork2 < 0)
{
  fprintf(stderr, "CHILD B FORK ERROR.\n");
}
else if (fork2 == 0)
{
  if (signal(SIGTSTP, handleSignal) == SIG_ERR)
  {
    fprintf(stderr, "Error catching signal Z\n");
  }
  fprintf(stdout, "I am child of B \n");

  while(sleep(5) == 0);
}
else
{
    // where parent code is
}

我保持它非常靠近你的样本,但是我用fprintf替换了“write”调用并添加了一个while循环来检查“sleep”是否返回了非零值(==&gt;一个信号中断了睡眠) 。如果我自己编写这段代码,我也不会使用signal(2),而是使用sigaction(2)。