signal()调用不激活

时间:2012-04-15 06:02:13

标签: c signals

我正在尝试编写一些代码,这些代码会生成一个新进程,但如果花费的时间太长,则会在一段时间后杀死该进程。这段代码在没有时间限制的情况下正常工作并且没有任何问题地执行execve,但是当我将4行代码放入并试图为我的execve调用cat时,孩子就被杀了,假设通过电话报警。

在这种情况下,signal调用似乎根本没有做任何事情,我在killproc中放了很多跟踪并且没有被调用。我如何错误地设置此计时系统?

void killproc(int sig) {
    printf("running?");
}

代码:(在孩子中)

if(MAX_TIME != -1){
    signal(SIGALRM, killproc);
    alarm(MAX_TIME);
}
// Process we are timing
int ret = execve(path, newargv, envp);

1 个答案:

答案 0 :(得分:3)

printf在信号处理程序中不安全;如果信号在错误的时间传递,内部结构将无效,printf将跟随错误的指针并崩溃。你有其他一些操作测试过吗?即使它没有崩溃,你也不会刷新输出或打印换行符,所以“运行?”可能会被困在stdio缓冲区中。

此外,signal()已过时;你想使用sigaction()。 (sigaction的联机帮助页还应说明哪些接口在信号处理程序中可以安全使用。)

那些人说,这也不是真正的问题;问题是你正在设置一个信号处理程序并期望它能够在exec()内生存。但是exec()取代了进程的地址空间,包括你的信号处理程序;因此,它重置处理程序,因为它知道后来没有信号处理程序的函数指针有效。 SIG_DFL可能就是你想要的(事实上你得到的),如果你不想修改你exec()的程序;如果您需要更多内容,就像您认为的那样,则需要修改exec()编辑的程序。

但是,我怀疑你真的想要别的东西:无论你认为想要放在信号处理程序中的任何工具,你真的希望在子进程退出后用父进程获得waitpid()