3

正如标题所示,我需要知道是否有某种方法可以使setrlimit RLIMIT_CPU的精度低于秒精度?

struct rlimit cpulimit;
cpulimit.rlim_cur = 5; // 5 seconds SIGXCPU
cpulimit.rlim_max = 5; // 5 seconds SIGKILL

(我知道在一个典型的系统上,一个程序一次可能需要大约 10 毫秒)我什至不需要它是毫秒精度。100ms 就可以了。

所以我很好奇它会不会是这样的:

struct rlimit cpulimit;
cpulimit.rlim_cur = 3500; // 3.5 seconds SIGXCPU
cpulimit.rlim_max = 4500; // 4.5 seconds SIGKILL

我没有看到解释我需要这个的原因以及我如何使用它的相关性。如果需要,我将编辑问题和信息。

提前致谢,

前任

4

2 回答 2

2

POSIX 仅允许在setrlimit. 可能有您可以使用的特定操作扩展,但我不知道有任何操作系统可以使用它。RLIMIT_CPU是大学多用户系统时代遗留下来的,你需要限制学生在尝试学习编程时可能造成的损害。因此,它在现代系统中很少被打磨、调试和改进。

根据经验,我知道 CPU 时间的计算和执行RLIMIT_CPU在不同的系统上受到了极大的限制,如果您使用短超时,您甚至可能SIGXCPU在两倍于您限制的时间后获得进程。因此,无论您要解决什么问题,您可能都想重新考虑您想要完成的工作并以不同的方式去做。

如果您确实需要以毫秒精度杀死一个花费过多 CPU 时间的进程,那么您可以做的最好的事情是拥有一个监督进程,该进程getrusage(RUSAGE_CHILDREN)经常探测子进程并对其进行射击。但请注意,您获得的计数器getrusage通常是概率性的(通过时钟中断采样),并且报告的 CPU 使用率可能与实际 CPU 使用率相差甚远,尤其是在运行进程的早期阶段(这些计数器可能会也可能不会与用于RLIMIT_CPU) 的相同。

于 2014-07-21T08:43:50.193 回答
1

您需要对潜在的恶意程序实施限制,还是仅对合作的程序实施限制?在后一种情况下,只需为 cputime 时钟设置一个计时器以传递致命信号即可。

为此,请timer_create使用时钟 IDCLOCK_PROCESS_CPUTIME_IDsigevent反映您要接收的信号的结构进行调用,然后timer_settime设置其超时。如果默认情况下信号是致命的,您甚至不需要为它安装处理程序。这将在您要限制其执行时间的进程内完成。

于 2014-07-21T06:54:03.880 回答