gpt4 book ai didi

c - 为子进程设置时间限制

转载 作者:行者123 更新时间:2023-12-02 03:10:46 25 4
gpt4 key购买 nike

我正在创建一个 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 设置的时间限制被删除了,那该怎么办呢?

感谢您的帮助。

最佳答案

I want to limit the time of a process, and I use setrlimit for it. But it seems that when I call execvp then, the time limit is kind of erased.

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

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

CPU 时间与墙上时间完全不同,后者不是托管资源。如果您希望 child 在一定时间后收到信号,请使用 alarm()函数(其倒数计时器也跨 exec 继承)。

关于c - 为子进程设置时间限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40164016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com