c / unix: прервать процесс, который выполняется слишком долго - PullRequest
1 голос
/ 03 сентября 2010

Мне нужно убить такие пользовательские процессы, которые занимают больше времени, чем указанный ожидаемый интервал в операционной системе UNIX (Solaris). Это необходимо сделать внутри процесса, который выполняется в данный момент.

Подскажите, пожалуйста, как этого можно достичь в C или UNIX?

Ответы [ 5 ]

7 голосов
/ 03 сентября 2010

См. Системный вызов alarm(). Он предоставляет вам сигнал SIGALRM, который ваш процесс может обработать и использовать для выхода.

2 голосов
/ 03 сентября 2010

С помощью setrlimit вы можете ограничить количество процессорного времени, используемого процессом. Ваш процесс получит SIGXCPU после превышения лимита.

#include <sys/resource.h>
struct rlimit limits = {42, RLIM_INFINITY};
setrlimit(RLIMIT_CPU, &limits);
2 голосов
/ 03 сентября 2010

Пока допустимо уничтожение без предупреждения процесса в сверхурочное время, одной из альтернатив является использование ulimit -t <time> во время запуска процесса.

0 голосов
/ 03 сентября 2010

Есть более простой способ. Запустите рабочий поток, чтобы выполнить работу, затем вызовите workerThread.join (timeoutInMS) в основном потоке. Это будет ждать так долго. Если этот оператор возвращается, а рабочий поток все еще выполняется, вы можете его убить и выйти.

0 голосов
/ 03 сентября 2010

Одно время мне приходилось решать точно такую ​​же проблему.

Мое решение было следующим:

Напишите программу контроллера, которая выполняет следующие действия:

  1. Создать дочерний процесс, который запускает процесс, которым вы хотите управлять.
  2. Вернувшись к родителю, разветвите второй дочерний процесс, который спит в течение максимально допустимого времени, а затем завершает работу.
  3. В родительском случае дождитесь завершения дочерних процессов, и в зависимости от того, что завершится первым, родитель убивает другого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...