进程间通信——管道
来源:互联网 发布:linux压缩文件夹zip 编辑:程序博客网 时间:2024/06/09 16:28
原文:http://www.cppblog.com/tianbianlan/archive/2009/07/18/90420.html
进程间通信——管道
管道简介
常说的管道都是匿名半双工管道,匿名半双工管道在系统中是没有实名的,并不可以在文件系统中以任何方式看到该管道。它只是进程的一种资源,会随着进程的结束而被系统清除。管道通信是在UNIX系统中应用比较频繁的一种方式,例如使用grep查找:ls |grep ipc
顾名思义,匿名半双工管道没有名字,这个特性导致了它在应用方面的局限性:
1.只能在有具有公共祖先的进程间通信,即或是父子关系进程间、或是在兄弟关系进程间通信。
2.数据只能在一个方向上移动
管道创建
尽管这样,半双工管道还是Linux系统上最常见的通信方式。Linux系统用pipe函数创建一个半双工管道,期函数原型为:
include<unistd.h>
int pipe(int fd[2]);
参数fd是一个长度为2的文件描述符,fd[1]为输入文件描述符,fd[1]为输出文件描述符;函数返回类型为int,0表示成功,-1表示失败。当成功返回时,则自动维护一个从fd[1]到fd[0]的同行管道。
管道操作
对管道进行读写,可以通过write和read进行:
write(fd[1], "create the pipe successfully !\n", 31 ); /*向管道写入端写入数据*/
char str[256];
read(fd[0], str, sizeof(str) ); /*从管道读出端读出数据*/
读写时,需要注意的问题:
1.当输出端关闭时,对输入端的写操作会产生信号SIGPIPE,说明管道读端已经关闭,并且write操作返回为–1,errno的值为EPIPE,对于SIGPIPE信号可以进行捕捉处理。
2.read返回0说明管道中没数据,但不能说明输入端是否关闭
操作流程
1.创建管道
2.利用fork创建子进程
3.控制管道流向
4.从fd[1]向管道写信息
5.通过fd[0]从管道渡信息
创建管道的标准库函数
#include <stdio.h>
FILE *popen( const char * command, const char *mode );
int pclose ( FILE *stream );
示例
引用《Linux C程序设计大全》 中的例子
- #include <unistd.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #define BUFES PIPE_BUF /* PIPE_BUF管道默认一次性读写的数据长度*/
- int main ( void ) {
- int fd[2];
- char buf[BUFSZ];
- pid_t pid;
- int len;
- if ( (pipe(fd)) < 0 ){ /*创建管道*/
- perror ( "failed to pipe" );
- exit( 1 );
- }
- if ( (pid = fork()) < 0 ){ /* 创建一个子进程 */
- perror ( "failed to fork " );
- exit( 1 );
- }
- else if ( pid > 0 ){
- close ( fd[0] ); /*父进程中关闭管道的读出端*/
- write (fd[1], "hello my son!\n", 14 ); /*父进程向管道写入数据*/
- exit ( 0);
- }
- else {
- close ( fd[1] ); /*子进程关闭管道的写入端*/
- len = read (fd[0], buf, BUFS ); /*子进程从管道中读出数据*/
- if ( len < 0 ){
- perror ( "process failed when read a pipe " );
- exit( 1 );
- }
- else
- write(STDOUT_FILENO, buf, len); /*输出到标准输出*/
- exit(0);
- }
- }
0
上一篇:necessitas
下一篇:获取Java项目根目录 N多方法(转载)
相关热门文章
- 欢迎光通信天地在ChinaUnix博...
- WPF Image典型错误:“正由另...
- DB210.5.5存在Bug打补丁到10.5...
- softRoCE/RDMA 安装与测试...
- 利用进程信息追查内存泄漏...
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 进程间通信—管道
- 进程间通信—管道
- 进程间通信—管道
- 进程间通信——管道通信
- 进程间通信——管道通信
- Windows进程间通信——管道
- 进程间通信——管道(Pipe)
- Linux进程间通信——管道
- 进程间通信——匿名管道
- Linux进程间通信——管道
- Linux进程间通信——管道
- 进程间通信——管道
- 进程间通信——管道
- 进程间通信——管道
- 进程间通信——管道
- 进程间通信——管道
- 进程间通信 ——管道
- 进程间通信——管道
- select 和 epoll的编程实现区别
- select 和 epoll的编程实现区别(2)
- linux非阻塞式socket编程之select()用法
- fd_set 用法 socket
- necessitas
- 进程间通信——管道
- 获取Java项目根目录 N多方法(转载)
- appledoc格式
- 世界首富如何炼成? 看盖茨20条箴言
- Java异常处理--将try/catch区段置于循环之外
- JVM学习笔记十一 之 编译期优化和运行期优化
- float和double类型的内存分布
- 更好更快更高效解析JSON说明[json-c]
- 通宵教室
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
加拿大标志性建筑
加拿大语言是什么
加拿大华人网
美国加拿大
加拿大在哪里
加拿大英语怎么读
加拿大城市排名
加拿大简介
加拿大维多利亚
加拿大吧
加拿大总理
加拿大国宝
加拿大货币
加拿大工作
加拿大枫叶
加拿大买什么便宜
加拿大出国
加拿大属于哪个洲
加拿大的英语
加拿大风景
加拿大华人
加拿大图片
加拿大面积和人口
加拿大土地面积
加拿大风景图片
加拿大说什么语言
加拿大气温
加拿大著名景点
移民加拿大后悔
加拿大美食
加拿大山火
加拿大旅游景点
加拿大景点
加拿大有多大
加拿大多少人
加拿大城市
加拿大语
加拿大地理位置
加拿大经济
加拿大打工
加拿大特色