资料介绍
														Linux 进程间通信的几种主要手段。其中管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 认清管道和有名管道的读写规则是在程序中应用它们的关键,本文在详细讨论了管道和有名管道的通信机制的基础上,用实例对其读写规则进行了程序验证,这样做有利于增强读者对读写规则的感性认识,同时也提供了应用范例。
管道概述及相关API应用
管道相关的关键概念
管道是Linux支持的最初Unix IPC形式之一,具有以下特点:
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
管道的创建:
#include int pipe(int fd[2])
该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。
管道的读写规则:
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。
从管道中读取数据:如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)。注:(PIPE_BUF在include/Linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至少为512字节,red hat 7.2中为4096)。
关于管道的读规则验证:
* readtest.c *
#include
#include
#include
main()
{
int pipe_fd[2];
pid_t pid;
char r_buf[100];
char w_buf[4];
char* p_wbuf;
int r_num;
int cmd;
memset(r_buf,0,sizeof(r_buf));
memset(w_buf,0,sizeof(r_buf));
p_wbuf=w_buf;
if(pipe(pipe_fd)《0)
{
printf(“pipe create errorn”);
return -1;
}
if((pid=fork())==0)
{
printf(“n”);
close(pipe_fd[1]);
sleep(3);//确保父进程关闭写端
r_num=read(pipe_fd[0],r_buf,100);
printf( “read num is %d the data read from the pipe is %dn”,r_num,atoi(r_buf));
close(pipe_fd[0]);
exit();
}
else if(pid》0)
{
close(pipe_fd[0]);//read
strcpy(w_buf,“111”);
if(write(pipe_fd[1],w_buf,4)!=-1)
printf(“parent write overn”);
close(pipe_fd[1]);//write
printf(“parent close fd[1] overn”);
sleep(10);
}
}
程序输出结果:
* parent write over
* parent close fd[1] over
* read num is 4 the data read from the pipe is 111
附加结论:管道写端关闭后,写入的数据将一直存在,直到读出为止。
 
												
												
												管道概述及相关API应用
管道相关的关键概念
管道是Linux支持的最初Unix IPC形式之一,具有以下特点:
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
管道的创建:
#include int pipe(int fd[2])
该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。
管道的读写规则:
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。
从管道中读取数据:如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)。注:(PIPE_BUF在include/Linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至少为512字节,red hat 7.2中为4096)。
关于管道的读规则验证:
* readtest.c *
#include
#include
#include
main()
{
int pipe_fd[2];
pid_t pid;
char r_buf[100];
char w_buf[4];
char* p_wbuf;
int r_num;
int cmd;
memset(r_buf,0,sizeof(r_buf));
memset(w_buf,0,sizeof(r_buf));
p_wbuf=w_buf;
if(pipe(pipe_fd)《0)
{
printf(“pipe create errorn”);
return -1;
}
if((pid=fork())==0)
{
printf(“n”);
close(pipe_fd[1]);
sleep(3);//确保父进程关闭写端
r_num=read(pipe_fd[0],r_buf,100);
printf( “read num is %d the data read from the pipe is %dn”,r_num,atoi(r_buf));
close(pipe_fd[0]);
exit();
}
else if(pid》0)
{
close(pipe_fd[0]);//read
strcpy(w_buf,“111”);
if(write(pipe_fd[1],w_buf,4)!=-1)
printf(“parent write overn”);
close(pipe_fd[1]);//write
printf(“parent close fd[1] overn”);
sleep(10);
}
}
程序输出结果:
* parent write over
* parent close fd[1] over
* read num is 4 the data read from the pipe is 111
附加结论:管道写端关闭后,写入的数据将一直存在,直到读出为止。
												下载该资料的人也在下载
												下载该资料的人还在阅读
											
											更多 >
											
										- 氢气管道渗漏问题的解决方法 2次下载
 - 石油化工行业管道专业用什么软件 13次下载
 - 谈谈嵌入式系统中多进程设计与进程通信
 - 在Linux实现通过管道进行通信的资料合集免费下载 0次下载
 - Linux应用基础教程之Linux如何进行系统管理 2次下载
 - 进程间通信之管道通信实验内容分析 1次下载
 - 进程间通信之:管道 0次下载
 - 压力管道文件汇编
 - 基于声发射威廉希尔官方网站 的管道泄漏检测系统
 - 城市蒸汽管道数字系统设计方法
 - 通信电缆配线管道图集 YD5062-98
 - 通信管道与通道工程设计规范 YD 5007—2003
 - 通信管道与通道工程设计规范
 - 甬沪宁进口原油管道SCADA系统
 - 通信管道设计规范
 
- 功率放大器在管道定位系统的硬件实现研究中的应用 107次阅读
 - 功率放大器在管道定位系统硬件中的应用 552次阅读
 - GIS管道精密对接设备机械系统的设计与研究 652次阅读
 - linux中管道符的使用 4058次阅读
 - Linux管道和FIFO应用笔记 598次阅读
 - 阐述匿名管道和命名管道 1060次阅读
 - Linux进程间通信方法之管道 1820次阅读
 - 浅谈进程之间的通信方式 2783次阅读
 - 管道数据流"实时性" 和使用小提示 3018次阅读
 - 管道仪表流程图中压力温度泵及容器的设计实例说明 3996次阅读
 - 管道设计条件的确定,管道布置应考虑的因素 1.1w次阅读
 - 你所不知道的linux匿名管道知识详解 3193次阅读
 - Linux中的管道和命名管道介绍 3924次阅读
 - 基于试片断电法的埋地钢制天然气管道防腐检测仪测量 4364次阅读
 - 金属管道探测器 4185次阅读
 
下载排行
本周
- 1TC358743XBG评估板参考手册
 - 1.36 MB | 330次下载 | 免费
 - 2开关电源基础知识
 - 5.73 MB | 6次下载 | 免费
 - 3100W短波放大电路图
 - 0.05 MB | 4次下载 | 3 积分
 - 4嵌入式linux-聊天程序设计
 - 0.60 MB | 3次下载 | 免费
 - 5基于FPGA的光纤通信系统的设计与实现
 - 0.61 MB | 2次下载 | 免费
 - 6基于FPGA的C8051F单片机开发板设计
 - 0.70 MB | 2次下载 | 免费
 - 751单片机窗帘控制器仿真程序
 - 1.93 MB | 2次下载 | 免费
 - 8基于51单片机的RGB调色灯程序仿真
 - 0.86 MB | 2次下载 | 免费
 
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
 - 0.00 MB | 234315次下载 | 免费
 - 2555集成电路应用800例(新编版)
 - 0.00 MB | 33564次下载 | 免费
 - 3接口电路图大全
 - 未知 | 30323次下载 | 免费
 - 4开关电源设计实例指南
 - 未知 | 21548次下载 | 免费
 - 5电气工程师手册免费下载(新编第二版pdf电子书)
 - 0.00 MB | 15349次下载 | 免费
 - 6数字电路基础pdf(下载)
 - 未知 | 13750次下载 | 免费
 - 7电子制作实例集锦 下载
 - 未知 | 8113次下载 | 免费
 - 8《LED驱动电路设计》 温德尔著
 - 0.00 MB | 6653次下载 | 免费
 
总榜
- 1matlab软件下载入口
 - 未知 | 935054次下载 | 免费
 - 2protel99se软件下载(可英文版转中文版)
 - 78.1 MB | 537796次下载 | 免费
 - 3MATLAB 7.1 下载 (含软件介绍)
 - 未知 | 420026次下载 | 免费
 - 4OrCAD10.5下载OrCAD10.5中文版软件
 - 0.00 MB | 234315次下载 | 免费
 - 5Altium DXP2002下载入口
 - 未知 | 233046次下载 | 免费
 - 6电路仿真软件multisim 10.0免费下载
 - 340992 | 191185次下载 | 免费
 - 7十天学会AVR单片机与C语言视频教程 下载
 - 158M | 183278次下载 | 免费
 - 8proe5.0野火版下载(中文版免费下载)
 - 未知 | 138040次下载 | 免费
 
	                电子发烧友App
	            
	        
	        
          
        
        
	                    
                        
                        
                        
                        
                        

创作
发文章
发帖  
提问  
发资料
发视频
上传资料赚积分
           
            
            
                
            
评论