Linux进程间通信之pipe

本文详细介绍了Linux进程间通信的两种方式:管道(Pipe)和命名管道(FIFO)。管道是单向通信,适用于父子进程或兄弟进程之间,而命名管道克服了管道无名和生命周期限制的缺点,允许不相关联的进程间通信。文中通过实例演示了如何使用C语言实现这两个通信机制,并解释了相关系统调用的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、管道(PIPE)

       从概念上说,管道是两个进程之间的一个connection,因此一个进程的标准输出就变成了另一个进程的标准输入。在Unix操作系统中,管道用于进程间通信(inter-process communication).

(1)Pipe是一种单向的通信方式,一个进程向管道中写数据,另一个进程从这个管道中读,数据只能向一个方向流动,需要双向通信时,要建立起两个管道。打开的管道是内存中的一段区域,它被看做是虚拟文件,但是它不是普通的文件,它只存在于内存中。

(2)创建管道的进程以及它的的子进程都可以使用管道进行读写操作,也就是只能用于父子进程和兄弟进程之间通信。

(3)如果一个进程尝试从还没有写入数据的管道中读数据,那么该进程会一直suspend到管道有数据写入。

(4)pipe系统调用会在进程的打开文件表中找到两个可用的位置,将这两个位置作为pipe的读和写的结束位置。写入的内容每次都添加在管道缓冲区的末尾,读数据是从缓冲区的头部读。

语法:

Parameters :
fd[0] will be the fd(file descriptor) for the 
read end of pipe.
fd[1] will be the fd for the write end of pipe.
Returns : 0 on Success.
-1 on error.

管道的两端可分别用文件描述符fd[0]和fd[1]描述,fd[0]为管道读端,只能用于读;fd[1]为管道写端,只能用于写,一般文件的I/O函数都可以用于管道,如close、read、write等。

管道是FIFO模式的,类似队列数据结构,读数据的大小不需要和写数据的大小匹配,一次可以写512字节的数据,一次也可以读1字节的数据。

实例:

#include <stdio.h> 
#include <unistd.h> 
#define MSGSIZE 16 
char* msg1 = "hello, world #1"; 
char* msg2 = "hello, world #2"; 
char* msg3 = &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值