3

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

在此示例代码中,当我让 时while(1),子进程收到 aSIGXCPU并在 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被删除了,那该怎么办呢?

感谢帮助。

4

1 回答 1

1

我想限制一个过程的时间,我用setrlimit它。但似乎当我打电话时execvp,时间限制被抹去了。

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

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

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

于 2016-10-20T20:55:00.747 回答