1.5 简单的无名管道使用

来源:互联网 发布:c语言引擎 编辑:程序博客网 时间:2024/06/05 04:03

(无名管道的使用。)


进程间通信方式之无名管道

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;   //创建进程的IDchar 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>



0 0