qidao123.com技术社区-IT企服评测·应用市场
标题:
管道
[打印本页]
作者:
用户云卷云舒
时间:
2025-4-30 08:45
标题:
管道
进程间通信指的是进程之间的信息交换,进程间通信的方式有很多,比如管道通信、信号通信、共享内存、消息队列、信号量组、POSIX信号量等。
进程间通信可以达到数据传输、共享资源、控制进程等目的,方便用户对进程进行控制和管理。
管道通信
管道通信采用的是半双工的通信方式,其中管道在Linux体系下也是文件的一种,其中分为:匿名管道(pipe)和命名管道(fifo)。
匿名管道
匿名管道的特点是没有名称,以是无法利用open来创建和打开,但是匿名管道进行数据读写的方式和普通文件一样,都是支持read()/write()操作的。
创建
利用pipe函数可以创建一个匿名管道
int pipe(int pipefd[2]);
//pipe()创建一个管道,可以用于进程之间通信的单向数据通道
//pipefd[]的数据存储返回的是两个用于读写管道文件的描述符
//pipefd[0]指的是管道的读取端
//pipefd[1]指的是管道的写入端
//从管道写入端写入的数据由内核进行缓冲,直到从管道的读取端把数据读取位置
//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体系中的路径。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4