【问题标题】:Set time limit to a child process为子进程设置时间限制
【发布时间】:2017-03-03 00:28:09
【问题描述】:

我正在创建一个 shell,在创建自己的 ulimit 函数时遇到问题:我想限制一个进程的时间,我为此使用了 setrlimit。但是,当我打电话给execvp 时,时间限制似乎被抹掉了。

在这个示例代码中,当我让while(1) 时,子进程收到SIGXCPU 并在3 秒后被杀死。但是当我改为 execvp(...) 时,它永远不会被杀死。

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>

int main(void) {
    struct rlimit t = {3, 8};

    uint32_t child_pid = fork();

    // father
    if (child_pid != 0) {
        waitpid(child_pid, NULL, 0);

    // child
    } else {
        setrlimit(RLIMIT_CPU, &t);
        char* s[3];
        s[0] = "sleep";
        s[1] = "1000";
        s[2] = NULL;

        /* while(1); */
        execvp(*s, s);
    }
}

如果我是对的,我用setrlimit设置的时间限制被删除了,那该怎么办?

感谢您的帮助。

【问题讨论】:

  • sleep 几乎不使用 CPU 时间。它永远不会达到 3 秒的限制。
  • 创建您自己的执行无限循环的程序,并执行该程序而不是 sleep。
  • 好的,明白了。我需要一种方法来测量实时而不是 CPU 时间,我认为 setitimer 会帮助我。谢谢
  • 对于实时,alarm() 是等效的。

标签: c process exec setrlimit


【解决方案1】:

我想限制一个进程的时间,为此我使用setrlimit。但是,当我打电话给execvp时,时间限制似乎被抹掉了。

这将与 exec 系列函数的 POSIX 规范相悖,也与setrlimit() 的 Linux 文档相悖。两者都说资源限制在 exec 中保留。 Linux 声称其实现也与 BSD 一致。换句话说,您的建议不太可能准确描述正在发生的事情。

基本上,您并不是在测试您认为自己正在测试的东西。您正在设置 CPU 时间的资源限制,但您正在测试的进程是 sleep,出于所有意图和目的不会消耗任何 CPU 时间。当然,由于您设置的资源限制,它永远不会收到SIGXCPU。

CPU 时间与墙时间完全不同,后者不是托管资源。如果您希望孩子在设定的挂起时间后接收到信号,请使用alarm() 函数(其倒计时计时器也通过 exec 继承)。

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 2011-12-02
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2017-04-06
    • 2017-12-10
    相关资源
    最近更新 更多