C ++ fork процесс, но не как дочерний - PullRequest
5 голосов
/ 23 апреля 2020

У меня есть команда, которая предоставляет диагностику c информации о запущенном процессе. Я хотел бы вызвать / выполнить эту команду непосредственно перед сбоем процесса и записать вывод в стандартный вывод / файл.

Однако эта команда не может быть запущена как дочерний элемент процесса, который она контролирует. Команда обнаруживает это. Он должен быть обработан как отдельный родительский процесс.

Есть ли способ порождать новый процесс, выполняя команду, но не как дочерний процесс?

1 Ответ

3 голосов
/ 23 апреля 2020

Вот очень базовый c пример использования метода, о котором я спрашивал в комментарии:

#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int result = fork();
    if(result == 0) {
        int fd = open("test", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
        assert(fd >= 0);
        int result = dup2(fd, STDOUT_FILENO);
        assert(result != -1);
        char * const argv[] = {"ls", NULL};
        char * const env[] = { NULL };
        result = execve("/bin/ls", argv, env);
        assert(result != -1);
    }
    return 0;
}

Вам придется настроить его для своих нужд, но это сохранит результаты ls в файле "тест". Хитрость в том, что dup2 заменяет стандартный дескриптор файла STDOUT_FILENO копией дескриптора файла в наш недавно открытый файл, поэтому вывод ls перенаправляется.

Я думаю, вы быть в состоянии использовать это, чтобы получить вывод от вашей команды.

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