ここでは、2つの子プロセス間で正しいパイプ処理を行う方法を理解しようとしています。私は単純に、あるLinuxコマンドの出力を別のLinuxコマンドに渡して、プログラムを正常に戻そうとしています。しかし、私は、フォークされている第二の子供がついてきて、親がこの子を永遠に待っていると推測しています。私はこのコードを長時間試していたので、なぜそれが固まっているのかを調べようとしていました。私はCシステムのプログラミングについてはまあまあですが、私は学びたいと思っています。このCコードで何が問題になっていますか?子供は帰っていないのですか?
誰もがプログラムが終了しない理由を知っていますか?
ご協力いただければ幸いです。
ありがとうございました。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char *a[2] = {"/bin/ls", NULL};
char *b[2] = {"/bin/cat", NULL};
char *envp[2] = {getenv("PATH"), NULL};
int fd[2], status;
pipe(fd);
int old_std_out = dup(1);
int old_std_in = dup(0);
dup2(fd[1], 1);
int pid = fork();
switch(pid)
{
case -1:
perror("Forkscrew");
exit(1);
break;
case 0:
execve(a[0], a, envp);
exit(0);
break;
default:
waitpid(-1, &status, 0);
dup2(old_std_out, 1);
break;
}
dup2(fd[0], 0);
pid = fork();
switch(pid)
{
case -1:
perror("Forkscrew");
exit(1);
break;
case 0:
execve(b[0], b, envp);
exit(0);
break;
default:
waitpid(-1, &status, 0);
dup2(old_std_in, 0);
break;
}
printf("\n");
return 0;
}
2匹の猫を飼っていませんか?あなたはフォークし、その後両方のフォークを再びですか? –
'ls'の出力がパイプバッファに収まらない場合はどうなると思いますか? – EOF
@SamKuhmonen 2匹の猫を飼っていますか?多分?最初のものは配列aのexecと配列bの次のexecです。私はfork()が子と親を返すと思った。 – user3499524