【问题标题】:Is it possible to have millisecond precision with setrlimit in c是否可以在 c 中使用 setrlimit 获得毫秒精度
【发布时间】:2014-09-11 13:59:32
【问题描述】:

正如标题所示,我需要知道是否有某种方法可以使 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

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

提前致谢,

【问题讨论】:

    标签: c setrlimit


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您解释 RLIMIT_CPU 是“剩余的”。 getrusage 接缝给出一些闪烁的结果。我在 250ms - 2500ms 的时间间隔内杀死一个子进程之前的时间。我将暂时开始使用 setitimer,因为这是我及时终止子进程的最大希望。或者你对时间测量有什么更好的想法(比如 setitimer 和 ITIMER_REALPROF )?
    • 根据我的经验,setitimer 是一个不错的选择。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多