PDA

View Full Version : [C UNIX] pipe con 3 processi


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;
}

vincenzo83
28-05-2008, 09:00
EDIT 1: .. ho scritto una scemenza

EDIT 2: comunque ho fatto esercizi simili...vedo che hai usato una sola pipe ... io utilizzavo DUE pipe distinte ...

stella_650
28-05-2008, 10:00
In quel caso, funzionava?come impostavi il problema?

vincenzo83
28-05-2008, 10:09
Allora sono passati diversi mesi dall'ultima volta che ho affrontato questi tipi di esercizi e ho dimenticato alcune cose ... comunque adesso ti copio un esercizio che ho fatto:


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
int fdpipe1[2]; /* pipe per ls e grep */
int fdpipe2[2]; /* pipe per grep e sort */
pid_t pid;
char stringa[100];


printf("stringa: ");
scanf("%s", stringa);

if( pipe(fdpipe1) == -1) {
perror("pipe 1");
return 1;
}

if( (pid=fork()) == -1) {
perror("fork");
return 1;
}

/* processo che si occupa di eseguire ls */
/* l'output di ls deve essere inviato nella pipe 1*/
if( pid != 0) {
close(fdpipe1[0]); /* deve solo scrivere */
dup2(fdpipe1[1], 1);
/* da questo momento, stdout è il lato scrittura della pipe */
close(fdpipe1[1]);
execlp("ls", "ls", NULL);
}
else {
if( pipe(fdpipe2) == -1) {
perror("pipe 2");
return 1;
}

if( (pid = fork()) == -1) {
perror("fork 2");
return 1;
}

/* processo che si occupa di eseguire grep */
/* l'input viene prelevato dalla pipe1 */
/* l'output viene inviato nella pipe2 */
if(pid != 0) {
close(fdpipe1[1]); /* deve solo leggere dalla pipe 1 */
dup2(fdpipe1[0], 0);
/* da questo momento, input viene prelevato dalla pipe 1 */
close(fdpipe1[0]);

dup2(fdpipe2[1], 1);
/* da questo momento, l'output viene inviato nella pipe 2 */

close(fdpipe2[1]);
close(fdpipe2[0]);
execlp("grep", "grep", stringa, NULL);
}
/* processo che esegue sort */
/* preleva l'input dall pipe 2 */
else {
close(fdpipe1[0]);
close(fdpipe1[1]);

close(fdpipe2[1]); /* non deve scrivere */
dup2(fdpipe2[0], 0);
close(fdpipe2[0]);
/* da questo momento l'input viene prelevato dalla pipe2 */

execlp("sort", "sort", "-r", NULL);
}
}
}

Se hai qualche dubbio,fammi sapere

vincenzo83
28-05-2008, 10:11
il programma esegue: ls | grep <stringa> | sort -r

vincenzo83
28-05-2008, 10:33
Quindi se ricordo bene:

il primo processo (P1) crea un figlio (P2) ed esegue il comando 1 e invia l’output nella pipe1. P2 crea un altro processo (P3), prelevare l’input dalla prima pipe, esegue il secondo comando e invia l’output nella seconda pipe. Il processo P3 legge l’input dalla seconda pipe ed esegue il terzo comando.

Gentilmente chiedo agli altri utenti del forum di controllare. Grazie :)

stella_650
28-05-2008, 11:27
grazie per l'aiuto...sei stato gentile. Questi esercizi che danno alla Parthenope... a volte mandano 1po' in crisi.

vincenzo83
28-05-2008, 11:51
grazie per l'aiuto...sei stato gentile. Questi esercizi che danno alla Parthenope... a volte mandano 1po' in crisi.

Allora sospettavo bene ... pure io sono della Parthenope :D

stella_650
28-05-2008, 12:30
Anke io.. xke' mi ricordi un mio amico "Ispanico"... Mo si scopre ke sei proprio tu. :)

vincenzo83
28-05-2008, 12:49
Anke io.. xke' mi ricordi un mio amico "Ispanico"... Mo si scopre ke sei proprio tu. :)

LOL :D non sono "Ispanico" … mai sentito

Comunque, come ho indicato anche sul forum della nostra uni, per la prova di lab, ti consiglio di vedere questo manuale (liberamente scaricabile): gapil (http://gapil.truelite.it/download.html)
è da qui che ho capito i "retroscena" delle pipe … a discapito di una lunga lettura

:)