【问题标题】:c/unix: abort process that runs for too longc/unix:中止运行时间过长的进程
【发布时间】:2010-09-02 20:09:14
【问题描述】:

我需要终止在 UNIX (Solaris) 操作系统上花费比所述预期间隔更长的时间的用户进程。这需要在当前正在执行的进程中完成。

请建议如何在 C 或 UNIX 中实现这一点?

【问题讨论】:

    标签: c unix process


    【解决方案1】:

    查看alarm() 系统调用。它为您提供了一个SIGALRM 信号,您的进程可以处理该信号并用于退出。

    【讨论】:

    • 你甚至不需要处理它 - SIGALRM 的默认操作是终止进程。
    • 我将处理 SIGALRM 以便优雅地终止我的进程
    【解决方案2】:

    只要在超时的情况下杀死进程是可以接受的,另一种选择是在启动进程时使用ulimit -t <time>

    【讨论】:

      【解决方案3】:

      使用setrlimit,您可以限制进程使用的 CPU 时间量。一旦超出限制,您的进程将收到SIGXCPU

      #include <sys/resource.h>
      struct rlimit limits = {42, RLIM_INFINITY};
      setrlimit(RLIMIT_CPU, &limits);
      

      【讨论】:

        【解决方案4】:

        有一次我不得不解决这个完全相同的问题。

        我的解决方法如下:

        编写一个执行以下操作的控制器程序:

        1. 派生一个子进程来启动您要控制的进程。
        2. 返回父进程,派生第二个子进程,该进程在允许的最长时间内休眠,然后退出。
        3. 在父级中,等待子级完成,先完成的一方会导致父级杀死另一个。

        【讨论】:

        • 可爱...但我认为 setrlimit() 更直接。
        • 你的灵魂听起来不错,请你简单解释一下
        • @Sachin:诀窍是在父进程中设置一个信号处理程序,并根据已完成子进程的 pid,终止受控进程或终止计时器进程。同样在每个进程启动后,记录子 pid 以及该进程是计时器进程还是工作进程。
        • 这些细节是抽象的。如果您能提供一个例子,将不胜感激。
        • @Sachin:示例需要的空间比评论允许的空间多得多。我建议你学习信号处理和进程创建。然后在你有一些半工作代码之后,有人可以帮助你。
        【解决方案5】:

        有一个更简单的方法。启动一个工作线程来完成这项工作,然后在主线程中调用workerThread.join(timeoutInMS)。那会等那么久。如果该语句返回并且工作线程仍在运行,那么您可以杀死它并退出。

        【讨论】:

        • 呃。深夜堆叠太晚,我深表歉意。完全看错了。
        猜你喜欢
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 2011-08-31
        • 2019-02-18
        相关资源
        最近更新 更多