目录
在Linux下的多个进程间的通信机制叫做IPC(进程间通信(Inter-Process Communication)),它是多个进程之间相互沟通的一种方法。在Linux下有多种进程间通信的方法:半双工管道、FIFO (命名管道)、消息队列、 信号量、共享内存等。使用这些通信机制可以为Linux下的网络服务器开发提供灵活而又坚固的框架。
1. 命名管道
命名管道的工作方式与普通的管道非常相似,但也有一些明显的区别。
□ 在文件系统中命名管道是以设备特殊文件的形式存在的。
□ 不同的进程可以通过命名管道共享数据。
1.1 创建FIFO(命名管道)
有许多种方法可以创建命名管道。
其中,可以直接用shell来完成。例如,在目录/tmp下建立一个名字为namedfifo的命名管道:
可以看出namedfifo的属性中有一个p,表示这是一个管道。
为了用C语言创建FIFO,用户可以使用mkfifo()函数。
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
1.2 FIFO操作
对命名管道FIFO来说,IO操作与普通的管道IO操作基本上是一样的,二者之间存在着一个主要的区别。
在FIFO中,必须使用一个open()函数来显式地建立连接到管道的通道。一般来说FIFO总是处于阻塞状态。也就是说,如果命名管道FIFO打开时设置了读权限,则读进程将一直“阻塞”,一直到其他进程打开该FIFO并且向管道中写入数据。这个阻塞动作反过来也是成立的,如果一个进程打开一个管道写入数据,当没有进程从管道中读取数据的时候,写管道的操作也是阻塞的,直到已经写入的数据被读出后,才能进行写入操作。如果不希望在进行命名管道操作的时候发生阻塞,可以在open()调用中使用 O_NONBLOCK标志,以关闭默认的阻塞动作。