管道

进程间通信指的是进程之间的信息交换,进程间通信的方式有很多,比如管道通信、信号通信、共享内存、消息队列、信号量组、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系统中的路径。

来源链接:https://www.cnblogs.com/lradian/p/18854854

© 版权声明
THE END
支持一下吧
点赞12 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容