PDA

View Full Version : [C] Piping Comandi con processi (LINUX)


Mods
14-06-2007, 19:30
Volevo realizzare un semplice programma in C che producesse come risultato il piping "ls | wc" ... e sto impazzendo! Non capisco proprio dove sia l'errore... se guardo nella process Table di Suse si pianta il tutto sulle due execlp.
Se invece, anche se privo di senso, metto in entrambi le execlp con "ls", da fare "ls | ls" non si pianta un bel niente ed esce il risultato...

Qualcuno non è che mi sa dire dov'è l'errore?



#include<stdio.h>
#include<unistd.h>

int main(){
int p[2];
pipe(p);

if(fork()){
close(0);
dup(p[0]);
execlp("wc","wc",0);
}
else{
close(1);
dup(p[1]);
execlp("ls","ls",0);
}
}

andbin
14-06-2007, 20:24
Ecco un esempio un po' più completo e funzionante:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>

int main (void)
{
pid_t pid;
int fd_pipe[2];
int r, status;

r = pipe (fd_pipe);

if (r == -1)
{
perror ("pipe");
exit (1);
}

pid = fork ();

if (pid == -1)
{
perror ("fork");
exit (1);
}
else if (pid == 0) /* Primo Figlio */
{
dup2 (fd_pipe[1], STDOUT_FILENO);
close (fd_pipe[0]);
close (fd_pipe[1]);

if (execlp ("who", "who", NULL) == -1)
{
perror ("execlp");
exit (1);
}
}

pid = fork ();

if (pid == -1)
{
perror ("fork");
exit (1);
}
else if (pid == 0) /* Secondo Figlio */
{
dup2 (fd_pipe[0], STDIN_FILENO);
close (fd_pipe[0]);
close (fd_pipe[1]);

if (execlp ("wc", "wc", "-l", NULL) == -1)
{
perror ("execlp");
exit (1);
}
}

close (fd_pipe[0]);
close (fd_pipe[1]);

while (wait (&status) > 0);

return 0;
}
Nota come ho creato 2 figli e come la pipe di scrittura venga copiata nello standard output del figlio 1 e la pipe di lettura venga copiata nello standard input del figlio 2.
Solo così infatti può fare l'equivalente di: who | wc -l