闵雇 发表于 2025-5-29 10:53:30

管道

进程间通信指的是进程之间的信息交换,进程间通信的方式有很多,比如管道通信、信号通信、共享内存、消息队列、信号量组、POSIX信号量等。
进程间通信可以达到数据传输、共享资源、控制进程等目的,方便用户对进程进行控制和管理。
管道通信

管道通信采用的是半双工的通信方式,其中管道在Linux系统下也是文件的一种,其中分为:匿名管道(pipe)和命名管道(fifo)。
匿名管道

匿名管道的特点是没有名称,所以无法使用open来创建和打开,但是匿名管道进行数据读写的方式和普通文件一样,都是支持read()/write()操作的。
创建

使用pipe函数可以创建一个匿名管道
int pipe(int pipefd);
//pipe()创建一个管道,可以用于进程之间通信的单向数据通道
//pipefd[]的数据存储返回的是两个用于读写管道文件的描述符
//pipefd指的是管道的读取端
//pipefd指的是管道的写入端
//从管道写入端写入的数据由内核进行缓冲,直到从管道的读取端把数据读取位置
//ret:成功返回0,失败返回-1注意:内核的缓冲区大小是固定的(linux系统下默认是4M大小),如果写入的速度快于读取的速度,则可能会发生缓冲区满的情况,如果读取的速度快于写入的速度,如果管道内部没有数据,则读取数据会出现阻塞等待的情况。
命名管道

由于匿名管道只适合一对一、并且具有亲缘关系的进程间通信,导致局限性较大,所以Linux系统下还提供了另一种管道,名称叫做命名管道,也可以称为有名管道、具名管道等。
相比于匿名管道而言,命名管道有自己的文件名,可以被open,同样也支持read/write访问。当然,管道文件毕竟不是普通文件,由于管道的特性的原因,所以管道是不支持指定位置读取数据的,也就意味着不能对管道文件进行lseek操作。
当然,由于命名管道有文件名,所以没有亲缘关系的进程间可以通过命名管道进行通信,并且可以支持多路同时写入。
创建

Linux系统下可以通过mkfifo()函数创建一个命名管道
int mkfifo(const char *pathname,mode_t mode);
//pathname:指定文件的路径
//mode:设置文件的权限,权限需要使用八进制,并且分为用户本身、用户所在的组、其他用户。
//ret:成功返回0,失败返回-1注意:如果是新建的管道文件,则需保证创建路径位于Linux系统内,尤其是虚拟机中操作的时候,不可以将管道文件创建在共享文件夹中,因为共享文件夹是windows系统中的路径。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

系味 发表于 2025-10-13 16:11:11

很好很强大我过来先占个楼 待编辑

厌外 发表于 2025-10-31 04:54:57

收藏一下   不知道什么时候能用到

马璞玉 发表于 2025-11-1 11:42:34

这个有用。

邹语彤 发表于 2025-12-3 01:30:53

收藏一下   不知道什么时候能用到

拓炊羡 发表于 2025-12-13 08:33:32

感谢分享,下载保存了,貌似很强大

史穹逊 发表于 2025-12-20 15:52:44

喜欢鼓捣这些软件,现在用得少,谢谢分享!

姚望舒 发表于 2026-1-15 12:11:19

谢谢楼主提供!

纪晴丽 发表于 2026-1-20 14:33:16

感谢分享

挫莉虻 发表于 2026-1-20 15:26:29

鼓励转贴优秀软件安全工具和文档!

越蔓蔓 发表于 2026-1-22 13:42:27

过来提前占个楼

虹姥 发表于 2026-1-25 08:34:30

很好很强大我过来先占个楼 待编辑

寨亳 发表于 2026-1-27 07:35:32

喜欢鼓捣这些软件,现在用得少,谢谢分享!

简千叶 发表于 2026-1-28 09:19:54

感谢,下载保存了

扎先 发表于 2026-2-2 02:09:32

东西不错很实用谢谢分享

溧久苟 发表于 2026-2-6 05:58:58

这个有用。

辉伫 发表于 2026-2-6 10:35:40

鼓励转贴优秀软件安全工具和文档!

染悄 发表于 2026-2-8 13:49:35

东西不错很实用谢谢分享

史穹逊 发表于 2026-2-8 16:08:56

热心回复!

龙正平 发表于 2026-2-9 13:48:37

谢谢分享,辛苦了
页: [1] 2
查看完整版本: 管道