C++ アプリケーション内から外部プログラムを実行する必要があります。そのプログラムからの出力が必要で (プログラムがまだ実行されている間にそれを見たい)、入力も取得する必要があります。
IO をリダイレクトするための最良かつ最もエレガントな方法は何ですか? 独自のスレッドで実行する必要がありますか?例はありますか?
OSX上で動作しています。
私は次のように実装しました:
ProgramHandler::ProgramHandler(std::string prog): program(prog){
// Create two pipes
std::cout << "Created Class\n";
pipe(pipe1);
pipe(pipe2);
int id = fork();
std::cout << "id: " << id << std::endl;
if (id == 0)
{
// In child
// Close current `stdin` and `stdout` file handles
close(fileno(stdin));
close(fileno(stdout));
// Duplicate pipes as new `stdin` and `stdout`
dup2(pipe1[0], fileno(stdin));
dup2(pipe2[1], fileno(stdout));
// We don't need the other ends of the pipes, so close them
close(pipe1[1]);
close(pipe2[0]);
// Run the external program
execl("/bin/ls", "bin/ls");
char buffer[30];
while (read(pipe1[0], buffer, 30)) {
std::cout << "Buf: " << buffer << std::endl;
}
}
else
{
// We don't need the read-end of the first pipe (the childs `stdin`)
// or the write-end of the second pipe (the childs `stdout`)
close(pipe1[0]);
close(pipe2[1]);
// Now you can write to `pipe1[1]` and it will end up as `stdin` in the child
// Read from `pipe2[0]` to read from the childs `stdout`
}
}
しかし、出力として私はこれを得る:
作成されたクラス
id: 84369
ID: 0
なぜ2回呼び出され、なぜ最初にフォークしないのかわかりません。私は何をしていますか/間違っていますか。