Piszę prosty interpreter poleceń w C i utknołem na poleceniu które jest widoczne w tytule, a mianowicie
grep wzorzec1 t.txt | grep wzorzec2.
Do wywołania funkcji grep używam polecenia execlp(); Pierwszy grep wykonuję w procesie macierzystym zaś drugi w potomnym. Komunikuje się pomiędzy procesami za pomocą łącza oraz używam funkcji dup2() do podmienienia standardowego wejaścia/wyjścia tych funkcji. Zamieszczę fragment kodu, który może przybliży wam problem.
Kod: Zaznacz cały
pipe(fd1);
pid1=fork();
if (pid1==-1) return 1;
if (pid1==0)
{
close(fd1[0]);
dup2(fd1[1],STDOUT_FILENO);
switch (a1){
case 1 : execlp(pol1,pol1,NULL);
break;
case 2 : execlp(pol1,pol1,arg1[0],NULL);
break;
case 3: execlp(pol1,pol1,arg1[0],arg1[1], NULL);
break;
case 4 : execlp(pol1,pol1,arg1[0],arg1[1],arg1[2],NULL);
break;
case 5 : execlp(pol1,pol1,arg1[0],arg1[1],arg1[2],arg1[3],NULL);
break;
case 6 : execlp(pol1,pol1,arg1[0],arg1[1],arg1[2],arg1[3],arg1[4],NULL);
break;
}
wait();
}else{
close(fd1[1]);
dup2(fd1[0],STDIN_FILENO);
switch (a2){
case 0 : execlp(pol2,pol2,NULL);
break;
case 1 : execlp(pol2,pol2,arg2[0],NULL);
break;
case 2 : execlp(pol2,pol2,arg2[0],arg2[1],NULL);
break;
case 3 : execlp(pol2,pol2,arg2[0],arg2[1],arg2[2],NULL);
break;
case 4 : execlp(pol2,pol2,arg2[0],arg2[1],arg2[2],arg2[3],NULL);
break;
case 5 : execlp(pol2,pol2,arg2[0],arg2[1],arg2[2],arg2[3],arg2[4],NULL);
break;
}
}
Pozdrawiam.