首页 > 其他 > 详细

管道的简单应用

时间:2017-01-07 19:41:08      阅读:179      评论:0      收藏:0      [点我收藏+]

 

/**
 * 一个子进程读取文件,一个子进程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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!