2010-11-08 36 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),它們將可用於父母和孩子。父母關閉一端,孩子關閉另一端(並重定向第一端)。

聰明,不怕谷歌和手冊頁。