stella_650
28-05-2008, 08:24
Ciao a tutti, avrei bisogno di un aiutino per cercare di capire come potrei risolvere il mio problema. Devo scrivere un programmino che esegua il comando ls | sort -r | grep <pat> dove pat è inserito dall'utente, utilizzando 3 processi distinti.
Il programma che segue mi fa ls e la grep ma nn mi fa la sort...sono sicura che c'è qualche problema nell'uso dei descrittori della pipe...e vorrei un aiutino per capire dove e come agire....grazie in anticipo.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc,char *argv[])
{
int pfd[2],pid1,pid2;
if(argc!=2)
{
printf("lsSortGrep <pattern da ricercare>\n");
exit(0);
}
if(pipe(pfd)==-1)
{
perror("pipe() fallita\n");
exit(-1);
}
if((pid1=fork())<0)
{
perror("fork() fallita");
exit(-2);
}
if(pid1==0)
{
printf("Sono il primo...\n");
close(pfd[0]); //chiudo l'estremità di lettura che non uso
dup2(pfd[1],1);
close(pfd[1]);
execlp("ls","ls",NULL);
perror("errore sulla sort\n");
exit(-3);
}
if((pid2=fork())<0)
{
perror("fork() fallita");
exit(-5);
}
//creo il secondo figlio
if(pid2==0)
{
printf("Sono il secondo....\n");
close(pfd[1]);
dup2(pfd[0],0);
close(pfd[0]);
dup2(pfd[1],1);
close(pfd[1]);
execlp("sort","sort","-r",NULL);
perror("errore sulla grep\n");
exit(-3);
}
else
{
printf("Sono il papa'\n");
close(pfd[1]);
dup2(pfd[0],0);
close(pfd[0]);
execlp("grep","grep",argv[1],NULL);
perror("ls fallita");
exit(-4);
}
kill(pid1,1);
kill(pid2,1);
return 0;
}
Il programma che segue mi fa ls e la grep ma nn mi fa la sort...sono sicura che c'è qualche problema nell'uso dei descrittori della pipe...e vorrei un aiutino per capire dove e come agire....grazie in anticipo.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc,char *argv[])
{
int pfd[2],pid1,pid2;
if(argc!=2)
{
printf("lsSortGrep <pattern da ricercare>\n");
exit(0);
}
if(pipe(pfd)==-1)
{
perror("pipe() fallita\n");
exit(-1);
}
if((pid1=fork())<0)
{
perror("fork() fallita");
exit(-2);
}
if(pid1==0)
{
printf("Sono il primo...\n");
close(pfd[0]); //chiudo l'estremità di lettura che non uso
dup2(pfd[1],1);
close(pfd[1]);
execlp("ls","ls",NULL);
perror("errore sulla sort\n");
exit(-3);
}
if((pid2=fork())<0)
{
perror("fork() fallita");
exit(-5);
}
//creo il secondo figlio
if(pid2==0)
{
printf("Sono il secondo....\n");
close(pfd[1]);
dup2(pfd[0],0);
close(pfd[0]);
dup2(pfd[1],1);
close(pfd[1]);
execlp("sort","sort","-r",NULL);
perror("errore sulla grep\n");
exit(-3);
}
else
{
printf("Sono il papa'\n");
close(pfd[1]);
dup2(pfd[0],0);
close(pfd[0]);
execlp("grep","grep",argv[1],NULL);
perror("ls fallita");
exit(-4);
}
kill(pid1,1);
kill(pid2,1);
return 0;
}