c - setrlimit 不可靠?

标签 c time setrlimit

我正在尝试使用 setrlimit()限制流程花费的时间。但是,当我执行某些操作(如 printf())时,它似乎不起作用。

这是一个说明问题的测试程序:

#include <sys/resource.h>
#include <stdio.h>

int main(void) {
    int i;
    struct rlimit limit;
    limit.rlim_cur = 3;
    limit.rlim_max = 3; // send SIGKILL after 3 seconds 
    setrlimit(RLIMIT_CPU, &limit);

    // doesn't get killed
    for(i=0; i<1000000; i++)
        printf("%d",i);

    return 0;
}

但是,如果我将 for 循环替换为不同的例程,例如朴素的斐波那契数列:

int fib(int n) {
    if(n<=1) return 1;
    return fib(n-1)+fib(n-2);
}
int main(void) {
    ...
    fib(100);
    ...
}

它工作得很好。这里发生了什么? setrlimit() 真的不可靠吗?

最佳答案

CPU 限制是 CPU 秒数的限制,而不是耗时。 CPU 秒数基本上是 CPU 使用了多少秒,不一定与耗时直接相关。

当您执行 fib 调用时,您会敲击 CPU,以便耗时和 CPU 时间接近(大部分处理时间都花在了 CPU 上)。打印时情况并非如此,因为大部分时间都花在了 I/O 上。

所以在您的特定情况下发生的事情是设置了 rlimit 但您只是在进程完成之前没有使用三秒的 CPU 时间。

如下更改 main 会导致信号在我的系统上传送:

int main(void) {
    int i;
    struct rlimit limit;
    limit.rlim_cur = 3;
    limit.rlim_max = 3; // send SIGKILL after 3 seconds
    setrlimit(RLIMIT_CPU, &limit);

    while (1) {                      // Run "forever".
        for(i=0; i<100000; i++) {
            printf("%d\n",i);
        }
        fib(30);                     // some CPU-intensive work.
    }

    return 0;
}

当您在 Linux 下计时时,您会看到:

: (much looping).
52670
52671
52672
52673
52674
Killed

real   0m18.719s
user   0m0.944s
sys    0m2.416s

在这种情况下,耗时将近 20 秒,但 CPU 仅使用了 3.36 秒(用户 + 系统)。

关于c - setrlimit 不可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11661020/

相关文章:

C TCP 套接字 - 获取数据包目标名称

c - 为什么它会抛出错误 lvalue is required?

linux - linux+swap 查表

在 C (OSX) 中更改文件描述符限制

c - 值字符如何转换为整数?

c - 在 Windows 上的 C 中使用哪种路径格式, "D:\\source.txt"或 "D:/source.txt"?

python - Python 3.6 及更早版本的精确时间(纳秒)?

c - 为什么这个更快?提交 1 与提交 2

setrlimit 可以用于在一段时间内强制执行资源使用限制吗?

linux - 限制Linux中程序的内存使用