IPC:rodic->roura->potomek, Krupka

Frantisek Krupka krupka na pha.pvt.cz
Pondělí Srpen 25 14:57:13 CEST 1997


Jiri Jindra wrote:
> 
> Dobry den preji,
> jak bych zacal?, proste mi to nefunguje a nevim proc
> 
> co jsem mel v umyslu?
> aby rodicovsky proces zapisoval data pres rouru do procesu potomek,
> pricemz kod potomka je prepsan kodem programu-filtr (napr.) more,
> stdin potomka je napojen na rouru
> smer toku dat rodic -> potomek
> 

Vyber prikazu 'more' pro priklad neni ten nejstastnejsi. Prikaz more
totiz po vypsani urciteho poctu radku (dane terminalem) ceka na prikaz
(obvykle na klavesnici zadavate mezeru pro odrolovani cele stranky,
enter po radcich nebo q pro ukonceni)

Protoze jste procesu potomek uzavrel standardni vstup, nemuzete programu
more zadavat prikazy z klavesnice (jine pouziti programu more asi
postrada smyslu). 

Jestlize vypisujete pouze jedinou radku, vyse uvedene se neprojevi,
pokud vsak budete vypisovat radky, jejich pocet je vetsi nez pocet
viditelnych radku terminalu, Vas program by mel vypsat pouze prvni
stranku a potom zustat 'viset' (program more ceka na prikaz)

S programem more Vam bude fungovat tento priklad, kdy proces potomek
neuzavira svuj standardni vstup :

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{

char buf[255];
int roura[2], n, status;

pipe(roura);     

if(fork()==0)  
  {                            
  dup2(roura[0], 0);     /* neuzavira standardni vstup */  
  close(roura[0]); 
  close(roura[1]);         
  execl("/usr/bin/more", "more", NULL);
  }

close(roura[0]);
for(n=0; n<50; n++) write(roura[1], "testik\n", 7);
close(roura[1]);
wait(&status);
}


Vzhledem k vyse uvedenemu je vhodnejsi priklad treba s wc :

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{

char buf[255];
int roura[2], n, status;

pipe(roura);     

if(fork()==0)  
  {                            
  close(0);  
  dup(roura[0]);      /* Neni nutne pouzivat dup2() */
  close(roura[0]); 
  close(roura[1]);         
  execl("/usr/bin/wc", "wc", NULL);
  }

close(roura[0]);
for(n=0; n<50; n++) write(roura[1], "testik\n", 7);
close(roura[1]);
wait(&status);
}


                                    Krupka F.,


Další informace o konferenci Linux