Nowe posty

Autor Wątek: Potok nienazwany  (Przeczytany 5545 razy)

JrQ-

  • Gość
Potok nienazwany
« dnia: 2011-01-10, 13:48:55 »
Witajcie, mam problem z łączem nienazwanym, mianowicie chcę zrobić coś takiego:
cat plik.c | grep pdesk | grep pipe
.
Napisałem sobie na początek taki:
cat plik.c | grep pdesk
jednak nie mam pojęcia, jak zrobić potrójny, wiem, że na pewno trzeba użyć jeszcze fork() i pipe() jednak jak dokładnie to ma wygladać, to nie wiem, oto mój plik.c:
#include
#include
#include

main()
{
  int pdesk[2];
 
  if(pipe(pdesk)==-1)
  {
      perror("Tworzenie potoku");
      exit(1);
  }
     
  switch(fork())
  {
     case -1:
         perror("Tworzenie procesu");
         exit(1);    

     case 0:
         close(1);
         dup(pdesk[1]);
         close(pdesk[0]);
         execlp("cat", "cat", "plik.c", NULL);


     default:
         close(0);
         dup(pdesk[0]);
         close(pdesk[1]);
         execlp("grep", "grep", "pdesk", NULL);

         

   }
}
Proszę o pomoc.

Ksanderon

  • Gość
Potok nienazwany
« Odpowiedź #1 dnia: 2011-01-10, 17:02:50 »
dobra chcesz żeby komunikacja wyglądała jak w punkcie 1, 2 czy 3, czy możne 4(zapomniałem dorysować-taki jak punkt pierwszy tylko potomek potomka może gadać z matka)?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Potok nienazwany
« Odpowiedź #2 dnia: 2011-01-10, 17:15:12 »
Trochę źle zacząłeś.
"cat plik.c" powinien być w procesie rodzica "grep pdesk".
"grep pdesk" powinien być rodzicem "grep pipe".

(1) -> ((2) -> (3))

1. forkuje się na (1) - rodzic, oraz (2/3) - potomek,
2. w procesie potomka forkujesz (2/3) na (2) - rodzic oraz (3) potomek.

Postępujesz rekurencyjnie od lewej strony pipe do prawej. Inaczej się pogubisz.

Szybki przykład:
#include
#include
#include

main ()
{
int pdesk[2];
if (pipe (pdesk) == -1)
{
perror ("Tworzenie potoku");
exit (1);
}

// forkuj na (1)-rodzic oraz (2/3)-potomek
switch (fork ())
{
case -1:
perror ("Tworzenie procesu");
exit (1);

case 0: // potomek 1 stopnia (2/3)
{
     
int pdesk2[2];
close (0);
dup (pdesk[0]);
close (pdesk[1]);

if (pipe (pdesk2) == -1)
 {
   perror ("Tworzenie potoku");
   exit (1);
 }

// rozlacz potomka (2/3) na ((2)->(3))
switch (fork ())
 {
 case -1:
   perror ("Tworzenie procesu");
   exit (1);

 case 0: // potomek 2 stopnia (3)
   {
     close (0);
     dup (pdesk2[0]);
     close (pdesk2[1]);
     execlp ("grep", "grep", "pipe", NULL);
   }
   break;

 default: // rodzic drugiego stopnia (2)
   close (1);
   dup (pdesk2[1]);
   close (pdesk2[0]);
   execlp ("grep", "grep", "pdesk", NULL);
   break;

 }
}
break;

default: // rodzic (1)
close (1);
dup (pdesk[1]);
close (pdesk[0]);
execlp ("cat", "cat", "plik.c", NULL);
break;

}
}

JrQ-

  • Gość
Potok nienazwany
« Odpowiedź #3 dnia: 2011-01-10, 19:58:31 »
Dziękuję Wam :)