Как сделать тайм-аут для дочернего процесса после 5 секунд его запуска (дочерний процесс исполняется) - PullRequest
0 голосов
/ 22 апреля 2019

Как часть домашней работы, мне нужно создать дочерний процесс, который запускает файл .out и установить для него время ожидания 5 секунд. Дочерний процесс выполняет exec, и я хочу знать, как узнать, сделал ли дочерний процесс тайм-аут илинормально завершился в родительском процессе, который ожидает его завершения.

Я нашел в сети функцию setrlimit для установки времени ожидания 5 секунд на RLIMIT_CPU, и она работала, но не было никакого способа проверить, если дочерний процесстайм-аут или нет

Я также пытался выполнить цикл while с waitpid из NOHANG и использовал функцию time (), чтобы проверить, прошло ли 5 ​​секунд, но проблема была в том, что на самом деле это не 5 секунд, что дочерний процессработает в них, но 5 секунд в режиме реального времени. Поэтому на одном компьютере он работал нормально, а на другом - для процессов, которые на самом деле не работали в течение 5 секунд, но меньше.

спасибо за помощь!

вот код для rlimit:

struct rlimit limit = {5, 5};
        setrlimit(RLIMIT_CPU, &limit);
        if (execvp(outFilePath, argv) == -1) {
            return ERROR_OCCURED;
        }

и ожидание:

while (TRUE /*&& currentTime - start < 5*/) {
            if (waitpid(newPid, &newStatus, WNOHANG) != -1) {
                if (WIFSIGNALED(newStatus)) {
                    break;
                }
                if (WIFEXITED(newStatus)) {
                    hasTimeOut = FALSE;
                    break;
                }
            } else {
                if (errno == ECHILD) {
                    hasTimeOut = FALSE;
                    break;
                } else {
                    return -1;
                }
            }
            sleep(0);
            //currentTime = time(NULL);
        }

, и я установил hasTimeout впрежде чем ИСТИНА

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...