无名管道
来源:互联网 发布:adobe ic是什么软件 编辑:程序博客网 时间:2024/04/29 09:32
无名管道
无名管道是Linux中进程间通信的一种方式。
• 它只能用于具有亲缘关系的进程之间的通信
(也就是父子进程或者兄弟进程之间)。
• 它是一个半双工的通信模式,具有固定的读端和写端。
• 管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()和write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,即只存在于内核的内存空间中。
管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fds[0]和fds[1],其中
◇fd[0]固定用于读管道
◇fd[1]固定用于写管道
这样就构成了一个半双工的通道。
创建管道可以通过调用pipe()来实现。
管道关闭时只需使用普通的close()函数逐个关闭各个文件描述符。
构成了一个半双工的通道。
用pipe()函数创建的管道两端处于一个进程中,由于管道是主要用于在不同进程间通信的,因此这在实际应用中没有太大意义。实际上,通常先是创建一个管道,再通过fork()函数创建一子进程,该子进程会继承父进程所创建的管道 。
父子进程分别拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或写端的文件描述符关闭即可。此时,父子进程之间就建立起了一条“子进程写入父进程读”的通道。
管 道无名管道读写注意点
当管道中无数据时,读操作会阻塞向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将会一直阻塞。
只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到内核传来的SIFPIPE信号(通常Broken pipe错误)。
对一个关闭写端的管道做读操作时将返回0
下面是例子:
#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<string.h>int main(){ int fd[2]; pipe(fd);//创建无名管道 int re = fork();//创建子进程 char buffer[4]; memset(buffer,'\0',sizeof(buffer));//buffer初始化为'\0' if(re == 0) { close(fd[0]);//子进程关闭读端口 write(fd[1],"abc",3);//向无名管道写内容 } else if(re > 0 ) { close(fd[1]);//父进程关闭写端口 read(fd[0],buffer,sizeof(buffer));//从无名管道读内容 printf("read from fd[0] and buffer is :%s\n",buffer); } close(fd[0]); close(fd[1]); return 0;}
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 无名管道
- 有名管道&无名管道
- 无名管道和有名管道
- 无名管道有名管道续
- 无名管道和有名管道
- 无名管道和有名管道
- 有名管道和无名管道
- 插入最少字符成为回文串
- 华为软件编程规范学习(十一)--代码测试、维护
- IT公司笔试面试题系列
- 数据输入验证
- 我的常用软件
- 无名管道
- Java开发中JDBC连接数据库的代码和步骤
- iframe子父页面调用
- 【转】TDD实践测试分享
- expdp/impdp做oracle 10g 到 11g的数据迁移
- 9 高级IO函数
- x264和aac编解码器下载地址
- IOS设计模式的选择——>
- 导航框架组件