- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UnixLinux下的管道通信机制及管道通信程序示例
Unix/Linux下的管道通信机制及测试程序示例
基础知识
管道
1.1.1 基本知识
在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的问题,具体表现为:
· 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
· 读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。
1.1.2 分类
管道包括三种:1)普通管道PIPE通常有种限制一是半双工只能单向传输二是只能在父子进程间使用2)流管道s_pipe: 去除了第一种限制可以双向传输3)命名管道:name_pipe去除了第二种限制可以在许多并不相关的进程之间进行通讯(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力ATT的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来。其中,最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。/linshui91/archive/2010/09/29/1838770.html
/shinehoo/article/details/5818843
/guopengzhang/article/details/5528260
/a2010/0103/999/000000999870.shtml
实验过程
2.1 创建名为lab61.c的文件,并编码
/*****************lab61.c********************/
#include stdio.h
#include unistd.h
#include sys/resource.h
#include stdlib.h
int main(){
//define the pipe input port and output port
int port[2]; //port[0]:output port, as know read port; port[1]:input port, as know write port
//define the pipe
char putinpipe[100]; //putinpipe: store the buffer data into pipe
char getfrompipe[100];//getfrompipe: get the data from pipe and store in the buffer
//create the pipe
pipe(port);
//define the pid_t
pid_t id1, id2;
id1 = fork();
if (id10){//come
您可能关注的文档
- L《比较金融制度》复习资料.doc
- Monkeyrunner使用方法和实例.doc
- 500kV主变压器不拆高压引线进行预防性试验的方法.doc
- Linux网络设备驱动开发.doc
- 641碳和碳的氧化物单元检测.doc
- C实训设计文档(进销存管理系统).docx
- SQliteB4A教程大苏营.doc
- SQL存储过程入门级教程.doc
- 2014高考语言运用练习7.doc
- sql实训.doc
- Design for Manufacturing软件:Synopsys二次开发_(13).二次开发项目管理.docx
- EDA软件:Cadence Virtuoso二次开发_(7).数据库操作与脚本编程.docx
- EDA软件:Siemens EDA二次开发_(20).SiemensEDA的安全性与权限管理.docx
- EDA软件:Ansys RedHawk二次开发_(5).RedHawk核心功能解析.docx
- EDA软件:Cadence Virtuoso二次开发_(8).-SKILL语言基础.docx
- FAB软件:Applied Materials二次开发all.docx
- EDA软件:Ansys RedHawk二次开发_(21).RedHawk常见问题与故障排除.docx
- EDA软件:Ansys RedHawk二次开发_(19).RedHawk性能优化与调试.docx
- EDA软件:Ansys RedHawk二次开发_(9).RedHawk热分析.docx
- EDA软件:Mentor Graphics Calibre二次开发_(1).MentorGraphicsCalibre基础概述.docx
文档评论(0)