Zkuste toto:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
int pipefd[2];
int childpid,childpid2;
char* cmd[3]={"ls",NULL,NULL};
char* cmd2[3]={"grep",".c",NULL};
pipe(pipefd);
if(childpid=fork()){
//parent
close(pipefd[1]);
dup2(pipefd[0],STDIN_FILENO);
execvp("grep",cmd2);
}else{
//child
//write
close(pipefd[0]);
dup2(pipefd[1],STDOUT_FILENO);
execvp("ls", cmd);
}
return 0;
}
Ve skutečnosti se program ukončí okamžitě – ve skutečnosti se nadřazený proces ukončí před děti běží, což je důvod, proč je před "test.c" výzva shellu.
Věci můžete trochu vylepšit přidáním tohoto do rodiče:
wait(childpid);
wait(childpid2);
což způsobí, že rodič skončí po obou dětech.