私のプログラムは子プロセスを作成し、それに通信するパイプを設定します。この問題は、パイプからデータを読み取ろうとしたときに発生します。子プロセスは終了しています(私はwait
を使用しています)。EOFはデータストリームの最後になければなりません。このため、読み込みが終了します(マニュアルページのpipe
)。しかし、代わりにread
はフリーズし、さらにデータが来るのを待ちます。 ここには何が欠けていますか?子プロセスが終了したのでパイプからすべてのデータを読み取るC
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void setfd(int *in, int *out) {
dup2(out[1], 1);
dup2(in[0], 0);
}
int main(int argc, char *argv[]) {
int status;
int pipe2ch[2], pipe2pr[2];
char *newargv[] = {NULL, NULL};
newargv[0] = argv[1];
pipe(pipe2ch);
pipe(pipe2pr);
setfd(pipe2pr, pipe2ch);
int a;
if (!(a = fork())) {
setfd(pipe2ch, pipe2pr);
execve(newargv[0], newargv, NULL);
exit(1);
} else {
printf("hello!\n");
fflush(stdout);
char str;
wait(&status);
while (read(pipe2pr[0], &str, 1) > 0) {
fprintf(stderr, "%c", str);
}
exit(0);
}
}
親プロセスは 'pipe2pr [1]'を終了する必要があります。 EOFを得ること自体が妨げられています。 – kaylum