/** * 一个子进程读取文件,一个子进程grep */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> char *cmd1[3] = { "/bin/cat", "/etc/passwd", NULL }; char *cmd2[4] = { "/bin/grep", "root", "--color", NULL }; int main() { int mypipe[2]; if(pipe(mypipe) < 0){ perror("pipe error"); exit(1); } int i = 0; pid_t pid; for(; i < 2; i++){ pid = fork(); if(pid < 0){ perror("fork error"); exit(1); }else if(pid > 0){ if(i == 1){ close(mypipe[0]); close(mypipe[1]); wait(0); wait(0); } }else{ if(i == 0){ /** * cat 默认将数据写入标准输出,所以可以将标准输出重定向到管道 */ close(mypipe[0]); if(dup2(mypipe[1], STDOUT_FILENO) != STDOUT_FILENO){ perror("dup2 STDOUT_FILENO error"); exit(1); } close(mypipe[1]); if(execvp(cmd1[0], cmd1)){ perror("execvp error"); exit(1); } }else{ /** * grep 默认是从标准输入读取 */ close(mypipe[1]); if(dup2(mypipe[0], STDIN_FILENO) != STDIN_FILENO){ perror("dup2 STDIN_FILENO error"); exit(1); } close(mypipe[0]); if(execvp(cmd2[0], cmd2)){ perror("execvp error"); exit(1); } } } } return 0; }
原文:http://www.cnblogs.com/bai-jimmy/p/6259895.html