penso che ti serva questo =)



codice:
/*
 * Esercizio: scrivere un programma che esegua il comando di shell “ls| sort| grep<pat>” 
 * con tre processi distinti.
 */

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

#define READ  0
#define WRITE 1
//AVENDO DEFINITO LE pipe ALL' INIZIO OGNI PROCESSO ANCHE SE NN LE UTILIZZA DEVE CHIUDERLE      

int main(int argc, char *argv[])
{

	pid_t pid_0, pid_1, pid_2;
	int fd[2], fd2[2];
	pipe(fd);		// CREO UNA PIPE TRA PID0 e PID1 
	pipe(fd2);		// CREO UNA PIPE TRA PID1 e PID2

	if (pid_0 = fork() == 0) {	// Creo pid 0 è fa "LS"
		close(fd2[READ]);
		close(fd2[WRITE]);
		close(fd[READ]);
		dup2(fd[WRITE], 1);
		close(fd[WRITE]);
		execlp("ls", "ls", NULL);
	}

	if (pid_1 = fork() == 0) {	// Creo pid 1 è fa "SORT"
		close(fd[WRITE]);
		dup2(fd[READ], 0);
		close(fd[READ]);
		close(fd2[READ]);
		dup2(fd2[WRITE], 1);
		close(fd2[WRITE]);
		execlp("sort", "sort", NULL);
	}

	if (pid_2 = fork() == 0) {	// Creo pid 2 è fa "Grep" 
		close(fd[READ]);
		close(fd[WRITE]);
		close(fd2[WRITE]);
		dup2(fd2[READ], 0);
		close(fd2[READ]);
		execlp("grep", "grep", argv[1], NULL);
	}
	close(fd[READ]);
	close(fd2[READ]);
	close(fd[WRITE]);
	close(fd2[WRITE]);
	printf("Programma terminato con successo\n");
	exit(0);
}