In questo periodo sto realizzando una shell con funzionalità simili alla bash, e mi sono trovato nella difficoltà di implementare la pipe tra due processi (es. ls -l | less)...eccovi il codice finale (funzionante) relativo alla pipe :
//creo fisicamente la pipe
pid = fork();
if (pid == -1) { perror("Error "); exit(EXIT_FAILURE); }
if (pid == 0) {
//nuovo processo figlio della shell
//preparo la pipe fisica
if (pipe(fd) == -1) { perror("Error on pipe :"); exit(EXIT_FAILURE); }
child_pid = fork();
if (child_pid == -1) { perror("Error "); exit(EXIT_FAILURE); }
if (child_pid > 0) {
//Secondo processo della pipe
//chiudo stdin
close(0);
//chiudo canale di out della pipe
close(fd[1]);
//collego canale di in della pipe con il file-descriptor 0 (stdin)
dup(fd[0]);
//chiudo canale di in della pipe
close(fd[0]);
execvp(cmd2[0], cmd2);
perror("Error ");
exit(EXIT_FAILURE);
}
if (child_pid == 0) {
//primo processo della pipe
//chiudo stdout
close(1);
//chiudo canale di in della pipe
close(fd[0]);
//collego canale di out della pipe con il file-descriptor 1 (stdout)
dup(fd[1]);
//chiudo canale di out della pipe
close(fd[1]);
execvp(cmd[0], cmd);
perror("Error ");
exit(EXIT_FAILURE);
}
}
if (pid > 0) {
//processo shell
pid = waitpid(-1, &status, 0);
if (pid == -1) { perror("Error "); exit(EXIT_FAILURE); }
printf("process [%d] - status [%d]\n", pid, status);
}