1
我需要創建一個運行進程(我的另一個程序)並且可以與此進程通信的程序(發送stdin和接收stdout)。 我已閱讀關於popen()
和CreateProcess()
等功能,但我不太瞭解如何使用它們。Linux C++運行並與新進程通信
如果你給我看一些示例代碼(如何啓動進程,發送標準輸入,接收標準輸出),那就太棒了。 C++函數將是首選(如果有的話)。
謝謝你的建議。
我需要創建一個運行進程(我的另一個程序)並且可以與此進程通信的程序(發送stdin和接收stdout)。 我已閱讀關於popen()
和CreateProcess()
等功能,但我不太瞭解如何使用它們。Linux C++運行並與新進程通信
如果你給我看一些示例代碼(如何啓動進程,發送標準輸入,接收標準輸出),那就太棒了。 C++函數將是首選(如果有的話)。
謝謝你的建議。
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
),它們將可用於父母和孩子。父母關閉一端,孩子關閉另一端(並重定向第一端)。
聰明,不怕谷歌和手冊頁。