IPC进程间通信之无名管道与有名管道的对比

无名管道:

  • 首先它是内核空间的实现机制;
  • 然后只能用于亲缘进程间通信
  • 它在内核所占的大小是64KB
  • 它采用半双工的通信方式;
  • 请勿使用lseek函数

读写特点:

  • 若读端存在写管道,那么有多少数据,就写多少数据,直到无名管道写满为止,此时会出现写阻塞,当无名管道出现新的4KB空间,写操作就会解除阻塞;
  • 若读端不存在写管道,会出现管道破裂的情况;
  • 若写端存在读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
  • 若写端不存在读管道,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态;
  • 创建无名管道(pipe函数):
	#include <unistd.h>
	
	int pipe(int pipefd[2]);
	/*
	功能:
	
		创建一个管道,是一个单向的数据通道,可用于进程间通信
	
		数组pipefd返回两个指向管道的文件描述符:
	
			pipefd[0]指向管道的读端 
			pipefd[1]指向管道的写端
	
		写入管道的数据被内核缓冲(64KB),直到从管道中读走
	
	参数:
	
		操作管道的文件描述符数组 
	
		pipefd[0]指向读端 pipefd[1] 指向管道的写端
	
	返回值:
	
		成功 0
	
		失败 -1 重置错误码
	*/ 

有名管道:

  • 区别于无名管道,其可以用于任意进程间的通信
  • 同无名管道一样,也是半双工的通信方式
  • 有名管道的大小也是64KB
  • 也是不能使用lseek函数
  • 其本质上,是在内存上,在文件系统上只是一个标识
  • 有名管道会创建一个管道文件,只需要打开这个文件,进行相应的读写操作即可;

读写特点:

  • 若读端存在写管道,那么有多少数据,就写多少数据,直到有名管道写满为止,此时会出现写阻塞
  • 若读端不存在写管道,会出现两种情况
  • 第一种:读端没有打开,写端open函数的位置阻塞;
  • 第二种:读端打开后关闭,会出现管道破裂的现象;
  • 若写端存在读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
  • 若写端不存在读管道,也会出现两种情况
  • 第一种:写端没有打开,读端open函数的位置阻塞;
  • 第二种:写端打开后关闭,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态
  • 创建有名管道(mkfifo函数):
	#include <sys/types.h>
	#include <sys/stat.h>
	
	int mkfifo(const char *pathname, mode_t mode);
	/*
	功能:
	
			创建管道文件
	
	参数:
	
	    	pathname:管道路径和名字
	
	    	mode:管道文件的权限
	
	返回值:
	
	    	成功 0
	
	    	失败 -1 重置错误码
	*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值