すべてのパイプが閉じている場合でも、入力を取りたい:プログラムは、まだ私はこのシナリオを実現しようとしています
2の並列処理がtr /a-z/ /A-Z/
にパイプされ、最終的に
tr /a-z/ /A-Z/
プロセスが標準出力に接続されている
。
私は自分の目標を達成しようとするこのプログラムを書いている:
#include<stdio.h>
#include<unistd.h>
#include<wait.h>
int main()
{
int dummy;
int fd[2];
int i;
char* lsargs[] = {"/bin/ls", "-l", NULL};
char* lsargs2[] = {"cat", "/etc/group", NULL};
char* lsargs3[] = {"tr", "/a-z/", "/A-Z/", NULL};
char** am[] = {lsargs, lsargs2, lsargs3};
pipe(fd);
for (i = 0 ; i < 3 ; i++)
{
pid_t pid = fork();
if (pid == 0)
{
if (i != 2) // ls -l & cat
{
// 0 -> stdin, 1 -> pipe write end
close(fd[0]);
dup2(fd[1], 1);
close(fd[1]);
execvp(am[i][0], am[i]);
}
else //TR AZ AZ
{
// 0 -> pipe read end 1 -> stdout
close(fd[1]);
dup2(fd[0],0);
close(fd[0]);
execvp(am[i][0], am[i]);
}
break;
}
else{
wait(&dummy);
}
}
return 0;
}
私は正しい出力を得ることが、私のプログラムが終了していない、それはまだ入力を取りたいです。理由を理解するのを助けてくれますか?
最初のプロセスをフォークした後で待機しています。あなたのループはあまりにも賢いです、私はあなたがループを展開することをお勧めします –
@AnttiHaapala何をお勧めしますか?私はループを使用することは意味がないことを知っている、私はそれを特別な目的のために使用した。 –
'for'を使用する代わりに、コードを繰り返して繰り返します。どの部分を繰り返すことができるのか、その理由を認識することができます。今度は、あなたの親は、最初の子が終了する前に待つ* *次の子もforkされ、実行されず、パイプが走っていません。 –