SIGQUIT,通过快速连续的呼叫处理第二个信号

时间:2019-08-09 04:12:55

标签: c linux signals

我试图忽略子线程的第一个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”写入控制台的有效方法是什么?

1 个答案:

答案 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,因为它是两个进程

太...我希望我有用!