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

  • 无名管道:
  • 首先它是内核空间的实现机制;
  • 然后只能用于亲缘进程间通信
  • 它在内核所占的大小是64KB
  • 它采用半双工的通信方式;
  • 请勿使用lseek函数
  • 读写特点:
  • 若读端存在写管道,那么有多少数据,就写多少数据,直到无名管道写满为止,此时会出现写阻塞,当无名管道出现新的4KB空间,写操作就会解除阻塞;
  • 若读端不存在写管道,会出现管道破裂的情况;
  • 若写端存在读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
  • 若写端不存在读管道,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态;
  • 创建无名管道(pipe函数):
	#include 
	
	int pipe(int pipefd[2]);
	/*
	功能:
	
		创建一个管道,是一个单向的数据通道,可用于进程间通信
	
		数组pipefd返回两个指向管道的文件描述符:
	
			pipefd[0]指向管道的读端 
			pipefd[1]指向管道的写端
	
		写入管道的数据被内核缓冲(64KB),直到从管道中读走
	
	参数:
	
		操作管道的文件描述符数组 
	
		pipefd[0]指向读端 pipefd[1] 指向管道的写端
	
	返回值:
	
		成功 0
	
		失败 -1 重置错误码
	*/ 
  • 有名管道:
  • 区别于无名管道,其可以用于任意进程间的通信
  • 同无名管道一样,也是半双工的通信方式
  • 有名管道的大小也是64KB
  • 也是不能使用lseek函数
  • 其本质上,是在内存上,在文件系统上只是一个标识
  • 有名管道会创建一个管道文件,只需要打开这个文件,进行相应的读写操作即可;
  • 读写特点:
  • 若读端存在写管道,那么有多少数据,就写多少数据,直到有名管道写满为止,此时会出现写阻塞
  • 若读端不存在写管道,会出现两种情况
  • 第一种:读端没有打开,写端open函数的位置阻塞;
  • 第二种:读端打开后关闭,会出现管道破裂的现象;
  • 若写端存在读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
  • 若写端不存在读管道,也会出现两种情况
  • 第一种:写端没有打开,读端open函数的位置阻塞;
  • 第二种:写端打开后关闭,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态
  • 创建有名管道(mkfifo函数):
	#include 
	#include 
	
	int mkfifo(const char *pathname, mode_t mode);
	/*
	功能:
	
			创建管道文件
	
	参数:
	
	    	pathname:管道路径和名字
	
	    	mode:管道文件的权限
	
	返回值:
	
	    	成功 0
	
	    	失败 -1 重置错误码
	*/

你可能感兴趣的:(笔试题,C语言学习系列,linux,运维,服务器)