Linux C ++ запускается и общается с новым процессом - PullRequest
1 голос
/ 08 ноября 2010

Мне нужно создать программу, которая запускает процесс (моя другая программа) и может взаимодействовать с этим процессом (отправка stdin и получение stdout).Я читал о таких функциях, как popen() и CreateProcess(), но я не совсем понимаю, как с ними работать.

Было бы здорово, если бы вы показали мне пример кода (как начать процесс, отправьтеstdin, получить стандартный вывод).Функции C ++ предпочтительнее (если они есть).

Спасибо за совет.

1 Ответ

5 голосов
/ 08 ноября 2010

Интерфейс для функций POSIX только на языке Си. Но вы можете использовать их в C ++.

В основном:

#include <unistd.h>
// Include some other things I forgot. See manpages.

int main()
{
    // Open two pipes for communication
    // The descriptors will be available to both
    // parent and child.
    int in_fd[2];
    int out_fd[2];

    pipe(in_fd);  // For child's stdin
    pipe(out_fd); // For child's stdout

    // Fork
    pid_t pid = fork();

    if (pid == 0)
    {
        // We're in the child
        close(out_fd[0]);
        dup2(out_fd[1], STDOUT_FILENO);
        close(out_fd[1]);

        close(in_fd[1]);
        dup2(in_fd[0], STDIN_FILENO);
        close(in_fd[0]);

        // Now, launch your child whichever way you want
        // see eg. man 2 exec for this.

        _exit(0); // If you must exit manually, use _exit, not exit.
                  // If you use exec, I think you don't have to. Check manpages.
    }

    else if (pid == -1)
        ; // Handle the error with fork

    else
    {
        // You're in the parent
        close(out_fd[1]);
        close(in_fd[0]);

        // Now you can read child's stdout with out_fd[0]
        // and write to its stdin with in_fd[1].
        // See man 2 read and man 2 write.

        // ...

        // Wait for the child to terminate (or it becomes a zombie)
        int status
        waitpid(pid, &status, 0);

        // see man waitpid for what to do with status
    } 
}

Не забудьте проверить коды ошибок (которых у меня не было) и обратиться к man-страницам за подробностями. Но вы видите смысл: когда вы открываете файловые дескрипторы (например, через pipe), они будут доступны для родителя и потомка. Родитель закрывает один конец, потомок закрывает другой конец (и перенаправляет первый конец).

Будь умным и не бойся Google и man-страниц.

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