I/O重定向和管道:使用pipe、fork、exec详解

文章出处:http://blog.csdn.net/yake25/article/details/7447086


I/O重定向和管道:使用pipe、fork、exec详解。


要使 who | sort  用程序实现,需要进行 I/O重定向,参考了Unix / Linux编程实践教程,画了几个图来理解这个程序,可能会更好。

1.  当运行pipe( pipe_id )以及fork之后,父进程和子进程共享stdin、stdout和管道,如图所示:


2.  我们知道,可以设定子进程写,父进程读,也就是子进程执行who程序,通过写管道,输出到父进程的读管道口(这是没有重定向的情况),于是万恶的重定向来了,他告诉你可以进入管道,但是不是常规的那个门口进入,而是从另外一个门进入。但管道还是管道,只是进出口不同而已,你懂得。


第一步:关闭子进程的读管道口



第二步: 关闭子进程输出流



第三步: 复制子进程的写管道



第四步: 关闭子进程的写管道



至此,成功实现子进程写管道口角色的转换,于是在子进程执行程序,执行比如who时,他以为他输出到标准输出流,其实他已经输出到了写管道口。


3. 同理,对父进程进行一系列类似的处理







至此,成功实现角色转换;


代码:

#include "../apue.h"  
  
int main(int argc, char *argv[])  
{  
    int pid, pipe_id[2], newfd;  
    if(argc != 3)  
        oops("usage: cmd need 3 paraments", 1);  
          
    if(pipe(pipe_id) < 0)  
        oops("pipe", 1);  
          
    if((pid = fork()) < 0)  
    {  
        oops("fork", 1);  
    }  
    else if(pid == 0)           ///子进程负责写  
    {  
        close(pipe_id[0]);  
        if(dup2(pipe_id[1], 1) == -1)  
            oops("dup2", 1);  
          
        close(pipe_id[1]);  
        execlp(argv[1], argv[1], NULL);  
        oops("execlp", 2);  
    }  
    else                        ///父进程负责读  
    {     
        close(pipe_id[1]);  
        if(dup2(pipe_id[0], 0) == -1)  
            oops("dup2", 1);  
          
        close(pipe_id[0]);  
        execlp(argv[2], argv[2], NULL);  
        oops("execlp", 1);  
    }  
    exit(0);  
}  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值