如何在C中达到一定时间限制后准确地终止子进程?

ra1nmaster

我一直在尝试编写一个程序,该程序可以在孩子超过一定的运行时间后准确地杀死一个分叉的进程。该过程应从磁盘上的可执行文件产生。我在这里使用linux。让我们甚至不要考虑仅在Windows上派生一个进程的丑陋性(对于必须维护Windows源代码的人,我感到抱歉。)

我当前的解决方案setrlimit在子进程中使用该函数,然后继续调用execvp以用可执行文件覆盖子进程setrlimit功能可与一个参数被用于RLIMIT_CPU在为了限制CPU运行时间的方法。本质上,派生的孩子限制了它自己的运行时间,然后execvp用于启动可执行文件。

我写了一个proc_timer结构,它存储运行可执行文件所需的信息:

typedef struct _proc_timer {
    double limit;
    char** args;
    char* name;
    pid_t proc;
    int argc;
} proc_timer;

该结构已通过名为的函数正确分配和初始化make_timer但这不是问题。

当前代码如下所示:

int status;
const pid_t proc = fork();
if (proc < 0)
    return FORK_FAIL;

else if (proc == 0) {
    struct rlimit rlim;
    rlim.rlim_cur = rlim.rlim_max = (rlim_t)timer->limit + 1; // An extra second, since rlim_t is in seconds.
    if (setrlimit(RLIMIT_CPU, &rlim) < 0)
        _exit(TIME_FAILURE);

     execvp(timer->name, timer->args);
    _exit(NOT_FOUND);
}

timer->proc = proc; // save the PID, probably not useful though.
waitpid(proc, &status, 0); // wait for the child.

// If true, then the termination was caused by an exceeded time limit.
if (WTERMSIG(status) == SIGXCPU) {
   fprintf(stderr, "We crossed the time limit!");
}

请注意,在上面的代码中,我必须给子进程多于limit几秒钟的时间,因为struct rlimit只能接受type的限制rlim_t,该限制是整数。现在,如果用户想要一个浮点数,我仍然必须为子进程提供整数秒数。这就是为什么我不得不写:

rlim.rlim_cur = rlim.rlim_max = (rlim_t)timer->limit + 1; // An extra second, since rlim_t is in seconds.

这显然是一个过高的估计,但是我还没有考虑其他可行的选择。

无论如何,以下解决方案将无法正常工作,因为报警器会测量实际时间,而不是CPU时间,这在我编写此问题时并不知道。我只对CPU时间感兴趣。

但是,我已经找到了潜在的解决方案。它涉及在ualarm调用之前使用系统调用waitpid由于ualarm以微秒为单位的参数,因此比setrlimit解决方案要准确得多然后,紧接着waitpid,我将通过致电来禁用警报ualarm(0, 0)这样,如果父母仍在等待孩子并且超过了时间限制,则将发送父母SIGALRM,我可以处理。但是,此解决方案有很多问题,我永远不会考虑使用它。处理信号的唯一方法是使函数充当处理程序。可以使用sigaction或直接调用来完成signal安装处理程序的功能。但是,处理程序只能是一个带有一个参数的函数,这是发送信号的整数,无法让处理程序知道要杀死哪个进程!

解决此问题的唯一方法是设置一个全局变量来存储pid,但这会引起问题,因为此代码将用作GUI应用程序的背景代码,从理论上讲,用户应该能够在其中执行此过程一次多次。为所有不同的过程存储多个全局变量将使这种解决方案无法工作。

因此,这里的最佳解决方案是setrlimit在孩子中使用该功能。但是,我不能在这里准确使用浮点数!还有另一种更准确的解决方案吗?

肿胀

忽略我在评论中所说的话:我相信您正在setitimer使用ITIMER_VIRTUAL你会在孩子之前称这个execve经过一定的CPU时间后,它可以触发致命信号,其分辨率以毫秒为单位,并且(与timer_create不同ualarm)据记载可以存活execve但是请注意,没有什么可以阻止清除计时器本身的过程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在一段时间后终止子进程

来自分类Dev

一定时间后如何终止函数调用

来自分类Dev

一定时间后,从命令行停止/终止进程

来自分类Dev

如何在Javascript中达到一定限制后破坏数组

来自分类Dev

如何在Ubuntu 13.04中阻止进程一定时间

来自分类Dev

如何在Ubuntu 13.04中阻止进程一定时间

来自分类Dev

在一定时间内终止进程的逻辑

来自分类Dev

当另一个子进程完成时,如何终止子进程?

来自分类Dev

如何在一定时间后强制提交表单?

来自分类Dev

在一定时间后如何在asp.net中自动清除购物车

来自分类Dev

在一定时间间隔后,如何在jquery中重复调用特定的URL?

来自分类Dev

如何在java中重复运行多个任务并在一定时间后停止它

来自分类Dev

父鱼壳进程终止后立即终止子进程?

来自分类Dev

如何在一定时间内暂停进程?

来自分类Dev

如何在javascript中应用Css过渡延迟属性在一定时间后更改图像

来自分类Dev

asyncio在超时时终止子进程

来自分类Dev

一定时间后如何在后台杀死/停止应用

来自分类Dev

如何在一定时间间隔后更新列值

来自分类Dev

如何在指定时间后终止Shell脚本

来自分类Dev

一定时间后如何获得所有连接

来自分类Dev

一定时间后如何退出while循环?

来自分类Dev

一定时间后如何停止Python程序

来自分类Dev

在一定时间间隔后如何执行脚本

来自分类Dev

一定时间后如何关闭舞台JavaFX

来自分类Dev

在一定时间后如何强制用户输入?

来自分类Dev

一定时间后如何淡入和淡出div

来自分类Dev

在一定时间间隔后如何执行脚本

来自分类Dev

一定时间后,从nsmutablearray中删除nsobject

来自分类Dev

一定时间后在Android中获取通知

Related 相关文章

热门标签

归档