是否有可能有毫秒精度与setlimit在c



正如标题所示,我需要知道是否有某种方法可以使用setrlimitRLIMIT_CPU ?

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

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

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

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

我不认为解释我为什么需要这个以及我如何使用它有什么关系。如果需要的话,我会编辑问题和信息。

提前感谢,

POSIX只允许setrlimit的秒精度。您可能可以使用特定于操作的扩展,但我不知道有任何操作系统具有该扩展。RLIMIT_CPU是大学多用户系统时代遗留下来的产物,你需要限制学生在学习编程时可能造成的损害。因此,在现代系统中很少对其进行润色、调试和改进。

根据经验,我知道计算CPU时间和RLIMIT_CPU的实施在不同的系统上是非常有限的,如果您使用短超时,那么您甚至可能在您限制它的两倍时间之后无法为进程获得SIGXCPU。因此,无论你正在解决什么问题,你都可能需要重新思考你想要完成什么,并以不同的方式完成它。

如果你真的需要杀死一个花费了太多CPU时间的进程,那么你能做的最好的事情就是有一个监督进程,它经常用getrusage(RUSAGE_CHILDREN)探测子进程,然后杀死它。但是要注意,您从getrusage获得的计数器通常是概率性的(通过时钟中断采样),并且报告的CPU使用情况可能与实际CPU使用情况相差甚远,特别是在运行进程的早期阶段(这些计数器可能与RLIMIT_CPU使用的计数器相同,也可能不相同)。

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

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

最新更新