fork()
、exec()
、およびwait()
のCプログラムを作成しています。実行したプログラムの出力をファイルまたはバッファーに書き込みたいのですが。
たとえば、ls
を実行する場合、file1 file2 etc
バッファ/ファイルへ。標準出力を読み取る方法はないと思うので、パイプを使用する必要があるということですか?ここに私が見つけることができなかった一般的な手順はありますか?
出力を別のファイルに送信する場合(重要な詳細に焦点を合わせるためにエラーチェックを省略しています):
if (fork() == 0)
{
// child
int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
dup2(fd, 1); // make stdout go to file
dup2(fd, 2); // make stderr go to file - you may choose to not do this
// or perhaps send stderr to another file
close(fd); // fd no longer needed - the dup'ed handles are sufficient
exec(...);
}
出力をパイプに送信して、出力をバッファーに読み込むことができます:
int pipefd[2];
pipe(pipefd);
if (fork() == 0)
{
close(pipefd[0]); // close reading end in the child
dup2(pipefd[1], 1); // send stdout to the pipe
dup2(pipefd[1], 2); // send stderr to the pipe
close(pipefd[1]); // this descriptor is no longer needed
exec(...);
}
else
{
// parent
char buffer[1024];
close(pipefd[1]); // close the write end of the pipe in the parent
while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
{
}
}
あなたが何をしたいのかを正確に決定する必要があります-そしてできればそれをもう少し明確に説明してください.
実行したコマンドの出力先のファイルがわかっている場合:
親に子からの出力を読み取らせたい場合、子がその出力を親にパイプで戻すように手配します。
Linux/cygwin環境でこれを使用するように見えるので、 popen を使用します。ファイルを開くようなもので、実行プログラムstdout
を取得するだけなので、通常のfscanf
、fread
などを使用できます。
フォークした後、 dup2(2)
を使用して、ファイルのFDをstdoutのFDに複製し、実行します。