专注于嵌入式和图像处理
分类: LINUX
2012-02-25 16:30:27
Linux使用的进程间通信(IPC)方式:
1. 管道(pipe)和有名管道(FIFO)
2. 信号(signal)
3. 消息队列
4. 共享内存
5. 信号量
6. 套接字(socket)
管道通信:
管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。
管道包括无名管道和有名管道,前者用父进程和子进程间的通信,后者可用于任意两个进程间的通信。
无名管道由pipe()函数创建:
#include
int pipe(int filedis[2]);
当一个管道建立时,它会创建两个文件描述符:
filedis[0]用于读管道,filedis[1]用于写管道。
管道读写:必须先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道(其实就是文件描述符)。
FIFO:
#include
int mkfifo(const char *pathname, mode_t mode)
其实FIFO就是一个文件,一旦创建了一个FIFO,就可以用对文件操作的函数对其操作。
当打开FIFO时,非阻塞标志(O_NONBLOCK)将对以后的读写产生如下影响:
1. 没有使用O_NOBBLOCK:访问要求无法满足时进程将阻塞。如试图读取空的FIFO,将导致进程阻塞。
2. 使用O_NONBLOCK:访问要求无法满足时不阻塞,立刻出错返回,errno是ENXIO.
注意:管道中的数据读一次后就自动清空。