是否有可能在c中具有setrlimit的毫秒精度

时间:2014-07-21 06:17:48

标签: c setrlimit

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

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

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

所以我很好奇它可能是这样的:

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

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

提前致谢,

实施例

2 个答案:

答案 0 :(得分:2)

POSIX仅允许setrlimit中的第二精度。您可以使用特定于操作的扩展,但我不知道有任何操作系统。 RLIMIT_CPU是大学多用户系统时代的遗留问题,您需要限制学生在学习编程时可能造成的伤害。因此,它很少在现代系统中进行抛光,调试和改进。

根据我的经验,我知道在不同的系统上,占用CPU时间和RLIMIT_CPU的强制执行受到严重限制,你甚至可能在获得SIGXCPU之后获得getrusage(RUSAGE_CHILDREN)两倍的时间。如果你使用短暂的超时,限制它。所以无论你要解决什么问题,你可能都想重新思考你想要完​​成的事情并以不同的方式去做。

如果你真的需要杀死花费太多CPU时间和毫秒级精度的进程,你可以做的最好的事情就是有一个监督过程,经常用getrusage探测子进程并射击它。但请注意,从RLIMIT_CPU获得的计数器通常是概率性的(通过时钟中断采样),并且报告的CPU使用率可能与实际CPU使用率相差甚远,尤其是在运行过程的早期阶段(那些计数器可能与{{1}})使用的计数器相同或不同。

答案 1 :(得分:1)

您是否需要对潜在的恶意程序强制执行限制,还是仅对合作程序执行限制?在后一种情况下,只需为cputime时钟设置一个定时器来传递致命信号就可以了。

要执行此操作,请拨打时钟ID为timer_create的{​​{1}}和反映您要接收的信号的CLOCK_PROCESS_CPUTIME_ID结构,然后sigevent设置其超时。如果信号默认是致命的,您甚至不需要为它安装处理程序。这将在您想要限制的执行时间内完成。