|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jan 2007
Città: Parma
Messaggi: 4
|
[C] Piping Comandi con processi (LINUX)
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? Codice:
#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);
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ecco un esempio un po' più completo e funzionante:
Codice:
#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;
}
Solo così infatti può fare l'equivalente di: who | wc -l
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 07-09-2007 alle 17:13. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:12.



















