linux命名管道进程间通信,Linux进程间通讯--命名管道

IPC安全

前面总结了匿名管道,如今来看命名管道:因为匿名管道的一个限制就是:只能是有血缘关系的进程间才能够通讯,好比:有两个同祖先的子进程,父子进程等;为了突破这一个限制,想让没有任何关系的两个进程间也能正常通讯,因此就就有了命名管道这样的一个通讯机制,一块儿来看看:函数

命名管道spa

1、原理:code

管道的一个不足之处是没有名字,所以,只能用于具备亲缘关系的进程间通讯,在命名管道(named pip或FIFO)提出后,该限制获得了克服。FIFO不一样于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,所以,即便进程与建立FIFO的进程不存在亲缘关系,只要能够访问该路径,就可以经过FIFO相互通讯。blog

值得注意的是,FIFO(first input first output)老是按照先进先出的原则工做,第一个被写入的数据将首先从管道中读出。进程

2、命名管道的建立与读写

Linux下有两种方式建立命名管道。一是在Shell下交互地创建一个命名管道,二是在程序中使用系统函数创建命名管道。Shell方式下可以使用mknod或mkfifo命令,下面命令使用 mknod建立了一个命名管道:ip

mknod namedpipe

建立命名管道的系统函数有两个:mknod和mkfifo。两个函数均定义在头⽂文件sys/stat.h,内存

函数原型以下:input

#include

#include

int mknod(const char *path,mode_t mod,dev_t dev);

int mkfifo(const char *path,mode_t mode);

函数mknod参数中path为建立的命名管道的全路径名:mod为建立的命名管道的模式,指明其存取权限;dev为设备值,该值取决于文件建立的种类,它只在建立设备文件时才会用到。这两个函数调用成功都返回0,失败都返回-1。原型

3、实例

用mkfifo建立命名管道:

ddfb8a63843049e6aea16f91.html 其中_PATH_是文件路径名的宏定义:以下:

ddfb8a63843049e6aea16f91.html

“S_IFIFO|0666”指明建立一个命名管道且存取权限为0666,即建立者、与建立者同组的用户、其余用户对该命名管道的访问权限都是可读可写。

命名管道建立后就可使用了,命名管道和管道的使用方法基本是相同的。只是使用命名管道时,必须用open()将其打开。由于命名管道是一个存在于硬盘上的文件,而管道是存在于内存中的特殊文件。

须要注意的是,调用open()打开命名管道的进程可能会被阻塞。但若是同时用读写方式(O_RDWR)打开,则必定不会致使阻塞;若是以只读方式(O_RDONLY)打开,则调用open()函数的进程将会被阻塞直到有写方打开管道;一样以写方式(O_WRONLY)打开也会阻塞直到有读方式打开管道。

四:结束

文件系统中的路径名是全局的,各进程均可以访问,所以能够用文件系统中的路径名来标识一个IPC通道。 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,可是它的行为却和以前所讲的没有名字的管道(匿名管道)相似。

因为Linux中全部的事物均可被视为文件,因此对命名管道的使用也就变得与文件操做很是的统一,也使它的使用很是方便,同时咱们也能够像日常的文件名同样在命令中使用。

5、命名管道的安全问题

前面的例子两个进程之间的通讯问题,也就是说,一个进程向FIFO文件写数据,而另外一个进程则在FIFO文件中读取数据。试想这样一个问题,只使用一个FIFO文件,若是有多个进程同时向同一个FIFO文件写数据,而只有一个读FIFO进程在同一个FIFO文件中读取数据时,会发生怎么样的状况呢,会发生数据块的相互交错是很正常的?并且我的认为多个不一样进程向一个FIFO读进程发送数据是很普通的状况。

为了解决这一问题,就是让写操做的原子化。怎样才能使写操做原子化呢?答案很简单,系统规定:在一个以O_WRONLY(即阻塞方式)打开的FIFO中, 若是写入的数据长度小于等待PIPE_BUF,那么或者写入所有字节,或者一个字节都不写入。若是全部的写请求都是发往一个阻塞的FIFO的,而且每一个写记请求的数据长度小于等于PIPE_BUF字节,系统就能够确保数据决不会交错在一块儿。

命名管道总结到此,其他通讯机制,见下一篇博文。

赐教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值