我试图忽略子线程的第一个SIGQUIT
...
具体来说,是在每次写入后写入控制台,然后在第二次调用时退出。
我尝试过此代码的变体;即每个类似的堆栈溢出线程分为两个函数。不幸的是,对于孩子的处理程序而言,父循环似乎“太快了”。
SIGQUIT
的处理程序:
int goes = 0;
void install_handler(){
write(1, "SIGQUIT\n", 8);
if (goes == 1) exit(0);
goes += 1;
}
只是驾驶员:
{
if((child_pid = fork()) < 0) exit(1);
if (child_pid == 0 ) {
signal(SIGQUIT, install_handler);
while(1){}
} else {
sleep(1);
for (int i = 0; i < 3; i++) {
write(1, "KILLING\n", 8);
kill(child_pid, SIGQUIT);
// sleep(1);
}
}
return 0;
}
我希望输出为〜
KILLING
SIGQUIT
KILLING
SIGQUIT
KILLING
...
输出(在父循环中不休眠)是
KILLING
KILLING
KILLING
SIGQUIT
SIGQUIT
这不是我要达到的目标。确保在每次发出信号的信号时,我们都可以保证在不修改main()
方法的情况下将“ SIGQUIT”写入控制台的有效方法是什么?
答案 0 :(得分:0)
您的问题有一个有趣的答案。 但是首先,由于它很烦人,我不允许评论,所以我希望我不会犯任何错误。
int goes = 0;
int child_pid = 0;
void install_handler(){
if (child_pid == 0) exit(0); //to exit the program once done
write(1, "SIGQUIT\n", 8);
kill(child_pid, SIGQUIT);
write(1, "KILLING\n", 8);
//you can put it after the if depending on the output
if (goes == 1) {
kill(0, SIGQUIT);
exit(0);
} //this way the program will end himself at the end
// i guess the fact that goes was indented is a mistake
goes += 1;
}
如您所见,我将kill放入处理程序中,这样直到收到另一个kill才会发送kill。 (注意我在这里怎么叫pid?)
{
if((child_pid = fork()) < 0) exit(1);
if (child_pid == 0 ) {
while(1){
signal(SIGQUIT, install_handler);
}
} else {
sleep(1);
kill(child_pid, SIGQUIT);
write(1, "KILLING\n", 8);
for (int i = 0; i < 3; i++) {
signal(SIGQUIT, install_handler);
wait(); //you might even not need the wait!
// sleep(1);
}
}
return 0;
}
我强烈建议您使用sigaction而不是信号,它要精确得多。 我必须说我不确定我的答案,因为我在这台计算机上没有c,但通常我会使用sigaction并等待(而不是睡眠) 您也不必称它为child_pid,因为它是孩子的pid而不是孩子的pid,因为它是两个进程
太...我希望我有用!