0

我正在尝试编写一些代码来分叉一个新进程,但如果花费的时间太长,则会在一段时间后杀死该新进程。这段代码在没有时间限制的情况下运行良好,并且执行execve没有任何问题,但是当我将前 4 行代码放入并尝试调用cat我的 execve 时,孩子只是被杀死了,假设是调用警报。

在这种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);
4

1 回答 1

3

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

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

那些说,也不是真正的问题。问题是您正在设置一个信号处理程序并期望它能够在exec(). 但是exec()替换了进程的地址空间,包括你的信号处理程序;因此,它重置处理程序,因为它知道信号处理程序的任何函数指针在之后都不会有效。 SIG_DFL如果您不想修改正在执行的程序,可能是您在这里想要的(实际上是您得到的)exec();如果您需要更多东西,就像您认为自己需要的那样,您将需要修改正在exec()编辑的程序。

但是,我怀疑您真的想要其他东西:无论您认为要放入信号处理程序中的任何仪器,您确实希望在子进程退出并以waitpid().

于 2012-04-15T06:07:56.873 回答