进程间通信系列(3)匿名管道范例代码

来源:互联网 发布:中国微观数据库 编辑:程序博客网 时间:2024/05/21 09:55

范例程序通过父进程创建两个子进程,两个子进程通过管道进行通信,实现了cat /passwd | grep root的功能。

#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <sys/types.h>#include <wait.h>char *cmd1[3] = {"/bin/cat", "/etc/passwd", NULL};char *cmd2[3] = {"/bin/grep", "root", NULL};int main(){    int fd[2] = {0};    if(pipe(fd) < 0)    {        perror("pipe error");        exit(1);    }    int i = 0;    pid_t pid;    for(; i < 2; i++)    {       if(pid < 0)       {           perror("fork error");           exit(0);       }        else if(pid == 0)//child process       {            if(0 == i)//第一个子进程,负责往管道写入数据            {                //关闭读端                close(fd[0]);                /*                 *将标准输出重定向到管道的写端                 *(下面命令执行的结果会写入到管道中                 *而不是输出到屏幕)                 */                if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)                {                    perror("dup2 error");                    exit(1);                }                close(fd[1]);//因为被复制,可以直接关闭了                //调用exec函数执行cat命令                if(execvp(cmd1[0], cmd1) < 0)                {                    perror("execvp error");                    exit(1);                }                break;            }            else if(1 == i)//第二个子进程,负责从管道读取数据            {                //关闭写端,负责向管道写入数据                close(fd[1]);                                /*                 *将标准输入重定向到管道的读端                 *下面的命令grep的执行是从管道的读端                 *读取内容,而不是从标准输入读取                 */                                if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)                {                    perror("dup2 error");                    exit(1);                }                close(fd[0]);                //调用exec函数执行grep命令                if(execvp(cmd2[0], cmd2) < 0)                {                    perror("execvp error");                    exit(1);                }                break;            }       }       else//parent process       {            if(1 == i)            {                close(fd[0]);                close(fd[1]);                //父进程要等到子进程全部创建完毕才去回收                wait(0);                wait(0);            }       }    }    exit(0);}


0 0
原创粉丝点击