我正在编写一个shell,现在它来控制子进程。 当我在子进程使用signal (SIGTERM, SIG_DFL);
,通过按Ctrl + C产生关于子进程中的SIGINT
信号SIGINT,并且该信号终止整个操作系统壳。
我该如何终止例如“猫”的过程而不是整个壳? 我应该使用像出头:
void sig_handler(int sig) {
if(sig ==SIGINT)
{
kill(pid);
}
}
真的感谢插槽。
我正在编写一个shell,现在它来控制子进程。 当我在子进程使用signal (SIGTERM, SIG_DFL);
,通过按Ctrl + C产生关于子进程中的SIGINT
信号SIGINT,并且该信号终止整个操作系统壳。
我该如何终止例如“猫”的过程而不是整个壳? 我应该使用像出头:
void sig_handler(int sig) {
if(sig ==SIGINT)
{
kill(pid);
}
}
真的感谢插槽。
你的问题相当模糊。你能更清楚你想达到什么目的吗? 我想你应该使用signal(SIGTERM,sig_handler)而不是SIG_DFL,这是采取的默认操作。因为,你有一个信号处理程序,你可以调用它,而不是像SIG_INT或SIG_DFL这样的预定义函数。你的函数里面的代码看起来很好。只要你知道pid,你就可以杀死(pid)。
在exec'd孩子中,如果将SIGINT(和SIGQUIT)处理程序设置为父shell中的处理程序,则SIGINT(和SIGQUIT)处理程序将是SIG_DFL,而这很可能是正确的。 (当然,你不能在一个exec上继承一个非默认的信号处理程序,因为exec'd过程中通常不存在该函数。)
设置SIGTERM的处理程序不会影响对信号情报的反应,反之亦然。
你的外壳不应该需要传递信号给它的孩子。
你试过了吗?结果是什么? – alk
我想孩子的过程会变成僵尸。 –