我正在写一个shell,现在它来控制子进程。当我signal (SIGTERM, SIG_DFL);
在子进程中使用时,
信号 SIGINT 由 Ctrl + C 生成,该信号终止整个 OS shell。
我怎样才能只终止进程,例如“cat”,而不是整个 shell?我应该使用类似的东西:
void sig_handler(int sig) {
if(sig ==SIGINT)
{
kill(pid);
}
}
真的感谢一个插槽。
你的问题比较模糊。你能更清楚你想要达到的目标吗?我认为您应该使用 signal(SIGTERM, sig_handler) 而不是 SIG_DFL 这是默认操作。因为,你有一个信号处理程序,你调用它而不是像 SIG_INT 或 SIG_DFL 这样的预定义函数。函数内的代码看起来不错。只要你知道pid,你就可以做一个kill(pid)。
在被执行的子进程中,如果将 SIGINT(和 SIGQUIT)处理程序设置为父 shell 中的处理程序,则它们将是 SIG_DFL,这很可能是正确的。(当然,您不能跨 exec 继承非默认信号处理程序,因为该函数通常甚至不存在于 exec 进程中。)
为 SIGTERM 设置处理程序不会影响对 SIGINT 的响应,反之亦然。
您的外壳不需要向其子级传递信号。