I/O重定向和管道:使用pipe、fork、exec详解。
来源:互联网 发布:小米mix2尊享版 知乎 编辑:程序博客网 时间:2024/05/22 00:44
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);
- }
- I/O重定向和管道:使用pipe、fork、exec详解。
- I/O重定向和管道:使用pipe、fork、exec详解
- I/O重定向和管道:使用pipe、fork、exec详解
- I/O重定向和管道:使用pipe、fork、exec详解。
- I/O重定向和管道:使用pipe、fork、exec详解
- I/O重定向和管道
- I/O重定向和管道
- I/O重定向和管道
- I/O重定向和管道
- I/O重定向和管道
- 12.管道和I/O重定向
- I/O重定向和管道
- 管道和I/O重定向
- I/O重定向、管道
- Shell I/O重定向与exec的使用介绍
- linux 命令行 I/O 重定向和管道
- linux基础---管道和I/O重定向
- I/O重定向详解
- 对csdn的看法
- wikioi 1166 矩阵取数游戏(2007年NOIP全国联赛提高组)
- 2014美团校招笔试题之糖果不拆包组合数问题
- 给你的Ubuntu安装中文字体
- PrepareStatement与Statement之间的区别
- I/O重定向和管道:使用pipe、fork、exec详解。
- (4)事件处理——(5)为代码简洁做的快捷方式(Shortcuts for code brevity)
- 网站登录记忆跳转实现的一种方法
- JDBC处理事务的保存点
- 返回值优化问题
- android模拟web服务器
- DTD总结
- 调整 Java I/O 性能
- ASP.NET中Get和Post的用法