Установить ограничение по времени для дочернего процесса
Я создаю оболочку и у меня возникла проблема при создании собственного ulimit
Функция: я хочу ограничить время процесса, и я использую setrlimit
для этого. Но кажется, что когда я звоню execvp
тогда ограничение по времени стирается.
В этом примере кода, когда я позволю while(1)
дочерний процесс получает SIGXCPU
и убит через 3 секунды. Но, когда я делаю execvp(...)
вместо этого он никогда не убивается.
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
int main(void) {
struct rlimit t = {3, 8};
uint32_t child_pid = fork();
// father
if (child_pid != 0) {
waitpid(child_pid, NULL, 0);
// child
} else {
setrlimit(RLIMIT_CPU, &t);
char* s[3];
s[0] = "sleep";
s[1] = "1000";
s[2] = NULL;
/* while(1); */
execvp(*s, s);
}
}
Если я прав и срок, который я установил с setrlimit
стирается, как это сделать то?
Спасибо за помощь.
1 ответ
Я хочу ограничить время процесса, и я использую
setrlimit
для этого. Но кажется, что когда я звонюexecvp
тогда ограничение по времени стирается.
Это будет противоречить спецификациям POSIX для функций семейства exec и противоречит документации Linux для setrlimit()
, Оба говорят, что ограничения ресурсов сохраняются для каждого исполнителя. Linux утверждает, что его реализация также совместима с BSD. Другими словами, то, что вы предлагаете, вряд ли будет точной характеристикой происходящего.
По сути, вы не тестируете то, что, как вы думаете, вы тестируете. Вы устанавливаете ограничение ресурсов для процессорного времени, но процесс, на котором вы тестируете, sleep
, который для всех намерений и целей не потребляет никакого процессорного времени. Конечно, он никогда не получает SIGXCPU
в результате установленного вами лимита ресурса.
Время процессора совсем не то же самое, что время стены, а последнее не является управляемым ресурсом. Если вы хотите, чтобы ребенок получил сигнал по истечении установленного количества времени на стене, используйте alarm()
функция (чей таймер обратного отсчета также наследуется через exec).