【发布时间】:2010-09-02 20:09:14
【问题描述】:
我需要终止在 UNIX (Solaris) 操作系统上花费比所述预期间隔更长的时间的用户进程。这需要在当前正在执行的进程中完成。
请建议如何在 C 或 UNIX 中实现这一点?
【问题讨论】:
我需要终止在 UNIX (Solaris) 操作系统上花费比所述预期间隔更长的时间的用户进程。这需要在当前正在执行的进程中完成。
请建议如何在 C 或 UNIX 中实现这一点?
【问题讨论】:
查看alarm() 系统调用。它为您提供了一个SIGALRM 信号,您的进程可以处理该信号并用于退出。
【讨论】:
SIGALRM 的默认操作是终止进程。
只要在超时的情况下杀死进程是可以接受的,另一种选择是在启动进程时使用ulimit -t <time>。
【讨论】:
使用setrlimit,您可以限制进程使用的 CPU 时间量。一旦超出限制,您的进程将收到SIGXCPU。
#include <sys/resource.h>
struct rlimit limits = {42, RLIM_INFINITY};
setrlimit(RLIMIT_CPU, &limits);
【讨论】:
有一次我不得不解决这个完全相同的问题。
我的解决方法如下:
编写一个执行以下操作的控制器程序:
【讨论】:
有一个更简单的方法。启动一个工作线程来完成这项工作,然后在主线程中调用workerThread.join(timeoutInMS)。那会等那么久。如果该语句返回并且工作线程仍在运行,那么您可以杀死它并退出。
【讨论】: