Portál AbcLinuxu, 10. května 2025 03:49

Dotaz: Implementace roury v C

4.2.2005 10:17 zn30 | Brno
Implementace roury v C
Přečteno: 223×
Odpovědět | Admin
Dobrý den, snažím se realizovat v C následující příkaz bashe: ls -al | more. Vycházím z tohoto materiálu: http://osa.dcs.elf.stuba.sk/os/tutorial_c/, našel jsem jej tady v diskuzi. Stále mi to nefunguje (překlad proběhne bez chyb, po spuštění program zůstane viset a nereaguje na nic (kromě ctrl-c)). Kde dělám chybu? Děkuji dopředu.

Kód:
int main ()
{
  int fds[2];
  pid_t pid;
  pid_t pid2;
  
  pipe (fds);
  
  pid = fork ();
  if (pid == (pid_t) 0) 
   {
    close (1);
    dup (fds[1]);
    execlp ("ls", "ls","-al","/usr/include", 0);
   }
  else 
   {
    waitpid (pid, NULL, 0);
    
    pid2=fork();
     
    if (pid2 == (pid_t) 0) 
     {
       close (0);
       dup (fds[0]);
       execlp ("more","more", 0);
     }
    else 
     {waitpid (pid2, NULL, 0);}
   }
  return 0;
}
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.2.2005 11:04 zabza | skóre: 52 | blog: Nad_sklenkou_cerveneho
Rozbalit Rozbalit vše Re: Implemtace roury v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
18 řádek, waitpid() navíc (to ls samozřejmě nekončí, dokud si ty data někdo -- ten more -- nepřečte)
4.2.2005 11:34 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Implemtace roury v C
A ten more neskončí, pokud fds[1] budou mít 2-3 procesy otevřený... ;-)
4.2.2005 11:43 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Implemtace roury v C
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>


int main ()
{
  int fds[2];
  pid_t pid;
  pid_t pid2;
  
  pipe (fds);
  
  pid = fork ();
  if (pid == (pid_t) 0) 
   {
    close (1);
    dup (fds[1]);
    close (fds[0]);
    close (fds[1]);
    execlp ("ls", "ls","-al","/usr/include", 0);
   }
  else 
   {
    pid2=fork();
     
    if (pid2 == (pid_t) 0) 
     {
       close (0);
       dup (fds[0]);
       close (fds[0]);
       close (fds[1]);
       execlp ("more","more", 0);
     }
    else 
     {
      close (fds[0]);
      close (fds[1]);
      /* FIXME */
      wait (NULL);
      wait (NULL);
     }
   }
  return 0;
}
+-, moc jsem to nezkoumal.
4.2.2005 12:00 zn30 | Brno
Rozbalit Rozbalit vše Re: Implementace roury v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Díky moc, už mi to funguje. (Já tam ty "close(fds[x]" různě zkoušel umisťovat, ale dělal jsem to blbě)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.