1.5 简单的无名管道使用

(无名管道的使用。)


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

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>


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值