PDA

View Full Version : [c] problema pipe, dup2()


agosteeno
17-05-2010, 11:03
Salve a tutti, devo fare un programmino in c che implementa il pipeline shell di 3 comandi (in questo caso: who | sort | wc - l). Creo 3 processi dove ognuno dei quali esegue un comando e 2 pipe, una tra il primo e secondo e una tra il secondo e il terzo comando. Redirigo la stdout del primo sull'entrata in scrittura della prima pipe, lo stdin nell'uscita in lettura della prima pipe del secondo processo e il suo stdout sull'entrata in scrittura della seconda pipe e infine lo stdin del terzo nell'uscita in lettura della seconda pipe. Questo e' il codice:


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

int main(void)
{
pid_t pid, pid1, pid2;

int pfd[2];
int pfd1[2];

if(pipe(pfd) == -1)
{
perror("Creando la prima pipe");
return -1;
}

if((pid = fork()) == -1)
{
perror("Nella fork");
return -1;
}
if(!pid)
{
/** primo figlio */

if(dup2(pfd[1], 1) == -1)
{
perror("Nella dup2");
return -1;
}

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

execlp("who", "who", (char*) NULL);
}

if(pipe(pfd1) == -1)
{
perror("Creando la seconda pipe");
return -1;
}

if((pid1 = fork()) == -1)
{
perror("Nella seconda fork");
return -1;
}
if(!pid1)
{
/** secondo figlio */

if(dup2(pfd[0], 0) == -1)
{
perror("Nella dup2");
return -1;
}
/* qua si blocca sulla dup2*/
if(dup2(pfd1[1], 1) == -1)
{
perror("Nella dup2");
return -1;
}

printf("effettuata\n");
close(pfd[0]);
close(pfd[1]);
close(pfd1[0]);
close(pfd1[1]);
execlp("sort", "sort", (char*) NULL);
}

if((pid2 = fork()) == -1)
{
perror("Nella terza fork");
return -1;
}
if(!pid2)
{
/** terzo figlio */

if(dup2(pfd1[0], 0) == -1)
{
perror("Nella dup2");
return -1;
}

close(pfd1[0]);
close(pfd1[1]);
execlp("wc", "wc", "-l", (char*) NULL);
}

close(pfd[0]);
close(pfd[1]);
close(pfd1[0]);
close(pfd1[1]);

waitpid(pid,NULL,0);

waitpid(pid1,NULL,0);

waitpid(pid2,NULL,0);

return 0;
}


si blocca nel secondo figlio, sulla dup2() (come potete vedere nel commento nel codice). Penso sia qualche problema di accesso allo stdout, ma non so' come risolverlo...

agosteeno
17-05-2010, 16:36
Grazie lo stesso, ma ho risolto. Nel 3' figlio, anche se non li uso, devo chiudere i descrittori di file pfd[0] e pfd[1], xche' li eredita.