正如标题所暗示的那样,我需要知道是否有某种方法可以通过 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
我没有看到解释我需要它的原因以及我如何使用它的相关性。 如果需要,我会编辑问题和信息。
提前致谢
前
最佳答案
POSIX 只允许 setrlimit
中的秒精度。可能有您可以使用的特定于操作的扩展,但我不知道有任何操作系统可以使用它。 RLIMIT_CPU
是大学多用户系统时代遗留下来的东西,您需要限制学生在尝试学习编程时可能造成的损害。因此,它很少在现代系统中得到完善、调试和改进。
根据经验,我知道考虑 CPU 时间和 RLIMIT_CPU
的执行在不同的系统上受到可怕的限制,您甚至可能在两次之后都没有为进程获得 SIGXCPU
如果您使用较短的超时时间,则可以使用尽可能多的时间。因此,无论您要解决什么问题,您都可能需要重新考虑您想要完成的事情并以不同的方式来完成。
如果您真的需要以毫秒精度杀死一个花费过多 CPU 时间的进程,您可以做的最好的事情是让一个监督进程经常用 getrusage(RUSAGE_CHILDREN)
探测子进程够了就开枪。但请注意,您从 getrusage
获得的计数器通常是概率性的(通过时钟中断采样),并且报告的 CPU 使用率可能与实际 CPU 使用率相差甚远,尤其是在运行程序的早期阶段进程(这些计数器可能与用于 RLIMIT_CPU
的计数器相同,也可能不同)。
关于c - c中的setrlimit是否可以达到毫秒精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858738/