(无名管道的使用。)
进程间通信方式之无名管道
1:什么是管道以及无名管道:
管道是一种使用非常常用的通信机制。实际上管道和共享内存相似,是一种代表内存块的设备文件。但管道限制这块内存的的大小且规定读写方向。每个管道大小在linux系统中只有4k。同时管道只能单向传输,一个进程只能设定成读或写其中一种,而且必须要在运行时有一读一写两个进程。
使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。如果需要双向传输数据需要建立量个管道才能完成。
无名管道是没有名字的管道。这种管道使用简单,一般用在父子进程。
2:进程间无名管道通信
程序简述:
管道是linux中最常见的种通信方式,由于单向传输且内存占用只有4096b可以更大的节省内存。节主要介绍无名管道,无名管道由于没有名字所以只能在父子兄弟进程中进行数据传输,需要注意的是一个管道只能在一个进程内进行读,另一个进行写,不可以进行双向传输,也不能只建立读(或写),不然管道会破列无法传输。
重点掌握函数:
Pipe();
write();
read();
close();
代码翻译:(本来代码备注是有缩进的,可一家进来就变成html的了~~~~~)
<span style="font-size:12px;">#include<stdio.h>
#include<unistd.h>
int main()
{
int n,fd[2]; // 这里的fd是文件描述符的数组,用于创建管道做准备的*必 // 须建立,fd[]就是管道的嵌套字了
pid_t pid; //创建进程的ID
char line[100];//数据存储变量
if(pipe(fd)<0) // 创建管道
printf("pipe create error\n");
if((pid=fork())<0) //利用fork()创建新进程
printf("fork error\n");
else if(pid>0){ //这里是父进程,先关闭管道的读出端,然后在管道的写端写 // 入“hello world"
close(fd[0]); //标准的关闭,先关闭管道的读出端,然后在管道的读 // 出端写入数据
write(fd[1],"hello word\n",11);//write时如果无数据会等待数据输入, // 若要实现查询模式需要使用select函数,select函数的具体 // 用法请参阅书名数管道一节和百度。
}
else{
close(fd[1]); //这里是子进程,先关闭管道的写入端,然后在管道的读出端 // 读出数据
n= read(fd[0],line,100);//将管道中元素写入line,最长100个。为读到 // 的实际字符数
// printf("%s",line);
write(STDOUT_FILENO,line,n);//这条的意思是printf("%s",line);(注释 //掉那行与本语句意思相同)。原意为将line中前n个元素输出到
//STDOUT_FILENO,这个宏是标准打印,在stdio.h中
}
//exit(0);//程序在建立了两个进程之后退出,由于不同版本的gcc中exit库 //所在位置不同,所以暂时被注释掉。
}</span>