Nowe posty

Autor Wątek: Gigantyczny potok  (Przeczytany 2432 razy)

twardziel

  • Gość
Gigantyczny potok
« dnia: 2012-01-05, 14:50:23 »
Mam do zrealizowania następujący potok
ps -ef | tr -s ' ': | cut -d: -f1 | sort | uniq -c | sort -n
Program się kompiluje  i uruchamia ale nie daje oczekiwanego rezultatu.

#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 ("ps", "ps", "-ef", NULL);
                    }
                    break;

                  default:    // rodzic drugiego stopnia (2)
                    close (1);
                    dup (pdesk2[1]);
                    close (pdesk2[0]);
                    execlp ("tr", "tr", "-s", "' ':", NULL);
                    break;
// -------------------------
switch (fork ())
 {
 case -1:
  perror ("tworz proc");
  exit(1);
 case 0:
  {
   close(0);
   dup (pdesk2[0]);
   close(pdesk2[1]);
   execlp ("cut", "cut", "-d:", "-f1", 0);
  }  
  break;
default:
 close(1);
 dup (pdesk2[1]);
 close (pdesk2[0]);
 execlp("sort", "sort", 0);
 break;
switch( fork())
{
case -1:
 perror("tworz proc");
 exit(1);
case 0:
{
 close(0);
 dup(pdesk2[0]);
 close(pdesk2[1]);
 execlp("uniq", "uniq", "-c", 0);
}
break;
}
              }
            }
            break;
}

        default:    // rodzic (1)
            close (1);
            dup (pdesk[1]);
            close (pdesk[0]);
            execlp ("sort", "sort", NULL);
            break;
} }

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Gigantyczny potok
« Odpowiedź #1 dnia: 2012-01-05, 15:35:00 »
...
        close (pdesk2[0]);
        execlp ("tr", "tr", "-s", "' ':", NULL);
        break;
        // To, co poniżej nigdy się nie wykona
        [color=#FF0000]switch (fork ())
          {
          case -1:[/color]

...
Chyba kompletnie nie rozumiesz, tego, co napisałeś. Nie wystarczy skleić dwóch programów, żeby mieć dwukrotnie dłuższy potok.

twardziel

  • Gość
Gigantyczny potok
« Odpowiedź #2 dnia: 2012-01-06, 12:25:50 »
OK to mam coś takiego wszystko gra tylko, że nigdy się nie kończy. Pewnie jakiś deskryptor nie jest zamknięty ale nic nie mogę znaleźć.

#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:    // potomek 1 stopnia
            {
     
                int pdesk2[2];
                close (0);
                dup (pdesk[0]);
                close (pdesk[1]);

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

               
                switch (fork ())
                  {
                  case -1:
                    perror ("Tworzenie procesu");
                    exit (1);

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

if (pipe (pdesk3) == -1)
{
perror("tworzenie potoku");
exit(1);
}

switch (fork ())
{
case 0:
{
close(0);
dup (pdesk3[0]);
close (pdesk3[1]);
                  execlp("sort", "sort", 0);

}
break;

default:
close(1);
dup (pdesk3[1]);
close (pdesk3[0]);
execlp("cut", "cut", "-d:", "-f1", 0);
break;
}

 }
 break;
                  default:    // rodzic drugiego stopnia (2)
                    close (1);
                    dup (pdesk2[1]);
                    close (pdesk2[0]);
                    execlp ("tr", "tr", "-s", "' ':",  NULL);
                    break;

              }
            }
            break;

        default:    // rodzic (1)
            close (1);
            dup (pdesk[1]);
            close (pdesk[0]);
            execlp ("ps", "ps", "-ef", NULL);
            break;

        }
}