以下は私がそれを機能させようとしているコードです...
私は出力を期待していました
OUTPUT from PipeAttempt(args1, args2)
に続く
I am here
OUTPUT from PipeAttempt(args3, args4)
しかし実際には、PipeAttempt(args1、args2)からの出力しか得られません。
プログラムは私からの入力を待ちます。Enterキーを押すと、プログラムは終了します。
ここで何が欠けているのか教えていただけますか?
int main () {
char* args1 [] = {"/usr/bin/head", "/etc/passwd", NULL};
char* args2 [] = {"/bin/sort", NULL};
char* args3 [] = {"/bin/cat", "piped.input", NULL};
char* args4 [] = {"/usr/bin/wc", NULL};
PipeAttempt(args1, args2);
printf("I am here\n");
PipeAttempt(args3, args4);
return 0;
}
void PipeAttempt(char* args1[], char* args2[]) {
int pfildes[2]; <br>
pid_t cpid1, cpid2; <br>
char *envp[] = { NULL };<br>
if (pipe(pfildes) == -1) {perror("demo1"); exit(1);}
if ((cpid1 = fork()) == -1) {perror("demo2"); exit(1);}
else if (cpid1 == 0) { /* child: "cat a" */
close(pfildes[0]); /* close read end of pipe */
dup2(pfildes[1],1); /* make 1 same as write-to end of pipe */
close(pfildes[1]); /* close excess fildes */
execve(args1[0], args1, envp);
perror("demo3"); /* still around? exec failed */
exit(1); /* no flush */
}
else { /* parent: "/usr/bin/wc" */
close(pfildes[1]); /* close write end of pipe */
dup2(pfildes[0],0); /* make 0 same as read-from end of pipe */
close(pfildes[0]); /* close excess fildes */
execve(args2[0], args2, envp);
perror("demo4"); /* still around? exec failed */
exit(1); /* parent flushes */
}
}