进程间的通信-管道

文章介绍了Linux操作系统中两种类型的管道:无名管道和有名管道,它们用于不同进程间的通信。无名管道仅限于亲缘进程间通信,数据存储在内存中,而有名管道可实现任意进程间的通信,其作为文件系统的一部分,可以通过文件描述符进行读写操作。文章提供了创建、使用和删除有名管道的示例代码。

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

管道分为无名管道、有名管道。

1.无名管道

1.1 特点:

(1)无名管道只能用于父子进程或兄弟进程之间的通信。(亲缘进程)

(2)不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存(RAM)中。(ls -i不可查)

(3)一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。(无名管道有两端,写入端与读取端)

(4)无名管道最大容量为64K

1.2 pipe创建无名管道

(1)pipe函数

头文件: #include<unistd.h>

函数原型: int pipe(int filedes[2]);

函数介绍: pipe()会建立管道,并将文件描述词由参数 filedes 数组返回。filedes[0]为管道里的读取端,filedes[1]则为管道的写入端。

返回值:若成功则返回零,否则返回-1,错误原因存于 errno 中。

(2)进程内通信
(3)亲缘进程通信

2.有名管道

2.1 特点

(1)可以用于任意进程间的通信

(2)遵循先进先出原则,没有固定的读端与写端

(3)可以通过ls -i查看

2.2 makefifo创建有名管道

(1)makefifo函数

头文件: #include<sys/types.h>

#include<sys/stat.h>

函数原型: int mkfifo(const char * pathname,mode_t mode);

函数功能: mkfifo()会依参数 pathname 建立特殊的 FIFO 文件,该文件必须不存在,而参数 mode 为该文件的权限(mode%~umask),因此 umask值也会影响到 FIFO 文件的权限。mkfifo()建立的 FIFO 文件其他进程都可以用读写一般文件的方式存取。

返回值: 若成功则返回 0,否则返回-1,错误原因存于 errno 中。

(2)进程内通信
(3)父子进程间通信
(4)无亲缘进程间的通信
进程1写入
进程2读取

2.3 remove删除有名管道

头文件:#include<stdio.h>

删除文件:int remove(const char * pathname);

函数功能:remove()会删除参数 pathname 指定的文件。如果参数 pathname为一文件,则调用 unlink()处理,若参数 pathname 为一目录,则调用 rmdir()来处理。

返回值:成功则返回 0,失败则返回-1,错误原因存于 errno

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值