扯一下pipe.
来源:互联网 发布:中国大百科全书淘宝 编辑:程序博客网 时间:2024/05/17 23:26
先上代码:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ int pip[2]; if(pipe(pip)==0){ if(fork()==0) { close(1); dup2(pip[1],1); close(pip[0]); execlp("ls","ls","-l",NULL); } else { close(0); dup2(pip[0],0); close(pip[1]); execlp("wc","wc","-l",NULL); }}return 1;}
这是用管道和子父进程将shell 命令 ls -l的输出做为命令 wc -l的输入。
开始时,调用pipe()创建无名管道,然后fork个子进程。注意,子父进程一开始都用了close()函数,分别是关闭了标准输出和标准输入,然后用dup2()把这俩关联到管道的两端(pip[1]是管道的数据输入端,pip[0]就不用说了)。我之前,很搞不懂一个问题。比如,为什么要close它们!? close(pip[0])后,父进程怎么还能从管道读数据? 呵呵,当时我是学的不透彻。
现在,来讲讲我的想法:
看了M.Tim Jones的《GUN/LINUX编程环境》后,渐渐想懂了。为什么close? 其实我觉得close不close没什么关系,不过这种做法在套接字似乎有用,本人不搞套接字,不懂。后面一个问题,首先在fork后子父进程根据CPU调度分别执行,无论哪个先执行都没所谓,不过可以肯定是子进程先返回(因为它是信息发送者),当进程结束后,为管道分配的资源会被自动释放。 所以父进程还可从pip[0]段读取。
- 扯一下pipe.
- 每天来这里扯蛋一下心情
- 扯
- 一根头发导致的bug------扯一下软件开发经验
- 粗暴理解一下进程顺便扯一下静态链接和动态链接
- pipe()
- pipe
- pipe
- pipe
- pipe
- PIPE
- pipe
- pipe
- pipe
- pipe
- pipe
- pipe
- pipe
- java debug开关
- 关于Boolean类型在flex与java中间传递的问题
- 7条睡前养生习惯
- 6410 uboot代码重定位问题
- 用递归的方法实现输入输出回文
- 扯一下pipe.
- 线段树入门学习(兼解HDU1754)
- 利用handler.post()更新UI
- windows与linux下sigar的系统依赖文件配置! .
- java多线程 sleep()和wait()的区别
- mq put消息队列慢
- ubuntu下安装JDK详解
- Io 异常: The Network Adapter could not establish the connection
- session 机制和 httpsession 详解 。