2010-11-08 19 views
1

我需要创建一个运行进程(我的另一个程序)并且可以与此进程通信的程序(发送stdin和接收stdout)。 我已阅读关于popen()CreateProcess()等功能,但我不太了解如何使用它们。Linux C++运行并与新进程通信

如果你给我看一些示例代码(如何启动进程,发送标准输入,接收标准输出),那就太棒了。 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 
    } 
} 

不要忘记检查错误代码(我没有),并参考手册页了解详情。但是你看到了这样一个观点:当你打开文件描述符时(例如通过pipe),它们将可用于父母和孩子。父母关闭一端,孩子关闭另一端(并重定向第一端)。

聪明,不怕谷歌和手册页。