Linux C++运行并与新进程通信

1 c++ unix linux

我需要创建一个运行进程(我的另一个程序)的程序,并且可以与此进程通信(发送stdin和接收stdout).我已经阅读了类似的函数popen(),CreateProcess()但我真的不明白如何使用它们.

如果你给我看一些示例代码(如何启动进程,发送stdin,接收stdout),那将是很棒的.C++函数将是首选(如果有的话).

谢谢你的建议.

Ale*_* C. 5

POSIX的接口仅用于C语言.但是你可以在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
    } 
}
Run Code Online (Sandbox Code Playgroud)

不要忘记检查错误代码(我没有),有关详细信息,请参阅手册页.但是你看到这一点:当你打开的文件描述符(例如,通过pipe),他们将提供给家长和孩子.父母关闭一端,孩子关闭另一端(并重定向第一端).

要聪明,不要害怕谷歌和手册页.