|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
[C UNIX] pipe con 3 processi
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. Quote:
|
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
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 ...
__________________
Ultima modifica di vincenzo83 : 28-05-2008 alle 10:06. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
In quel caso, funzionava?come impostavi il problema?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
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:
Codice:
#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);
}
}
}
__________________
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
il programma esegue: ls | grep <stringa> | sort -r
__________________
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
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
__________________
Ultima modifica di vincenzo83 : 28-05-2008 alle 12:54. |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
grazie per l'aiuto...sei stato gentile. Questi esercizi che danno alla Parthenope... a volte mandano 1po' in crisi.
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
Quote:
__________________
|
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Anke io.. xke' mi ricordi un mio amico "Ispanico"... Mo si scopre ke sei proprio tu.
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
Quote:
Comunque, come ho indicato anche sul forum della nostra uni, per la prova di lab, ti consiglio di vedere questo manuale (liberamente scaricabile): gapil è da qui che ho capito i "retroscena" delle pipe … a discapito di una lunga lettura
__________________
Ultima modifica di vincenzo83 : 28-05-2008 alle 13:54. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:51.











VIDEOLEZIONI di Matematica, Informatica, Fisica I & II e MOLTO altro, GRATIS !!! 








