grazie per le risposte, al momento il codice è questo, probabilmente contiene degli errori ma a causa del problema che ho postato non ho potuto ancora testarlo.
codice:
/* Scrivere un programma C e Posix che implementi la seguente pipeline acquisita da input
* da riga di comando: ps -f | grep *.txt | wc -c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <errno.h>
int main(int argc, char *argv[])
{
pid_t figlioA, figlioB;
int fdpipe1[2], fdpipe2[2], i;
if (argc!=9)
printf("%d\n", argc);
pipe(fdpipe1);
if ((figlioA = fork()) < 0) //Creazione figlio A
perror("Errore fork1");
else if (figlioA == 0) { //Figlio A
close(fdpipe1[0]);
dup2(fdpipe1[1], 1);
pipe(fdpipe2);
dup2(fdpipe2[0], 0);
if ((figlioB = fork()) < 0) //Creazione figlio B, figlio di A
perror("Errore fork2");
else if (figlioB == 0){ //Figlio B
close(fdpipe2[0]);
dup2(fdpipe2[1], 1);
close(fdpipe2[1]);
execlp(argv[1], argv[1], argv[2], NULL);
}
else { //Continuo figlio A
waitpid(figlioB, NULL, 0);
close(fdpipe2[1]);
execlp(argv[4], argv[4], argv[5], NULL);
}
}
else { //Il padre
close(fdpipe1[1]);
dup2(fdpipe1[0], 0);
waitpid(figlioA, NULL, 0);
execlp(argv[7], argv[7], argv[8], NULL);
}
}
Detta in breve, il padre crea 1 figlio A, il figlio A crea un figlio B. Il figlio B esegue la ps, il figlio A la grep, il padre wc.
Ora coi vostri consigli, sia con " ", che con ' ', il risultato di argc è 2, cioè il nome dell'eseguibile e la scritta, ora dovrei fare un parsing su argv[2] e sistemarmi il codice immagino.
Giusto? Notate altri problemi?
EDIT: Pero' pensandoci, mi sembra stupido fare un parsing, potrei semplicemente vedere se la stringa è stata scritta in quella maniera con una strcmp e poi mettere nelle varie execlp le parti che mi servono come stringhe. Questo rendebbe l'esercizio abbastanza strano pero', sono forse io che mi faccio troppi problemi?