Установить ограничение по времени для дочернего процесса

Я создаю оболочку и у меня возникла проблема при создании собственного 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).

Другие вопросы по тегам