这里有点奇怪的情况,我以为我用报警信号解决了。我有一个父母要求孩子。现在在这个子进程中,我希望它能够识别" 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
}
答案 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)。