Linux 进程间通讯(IPC)详细总结 2有名管道。
来源:互联网 发布:网络大电影 杀无赦 编辑:程序博客网 时间:2024/05/17 07:26
有名管道概述及相关API应用
2.1 有名管道相关的关键概念
管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。
2.2有名管道的创建
1,建立需要的头文件
#include <sys/types.h>
#include <sys/stat.h>
2,建立函数
int mkfifo(const char *pathname, mode_t mode)int mkfifo(const char * pathname, mode_t mode)
该函数的第一个参数是一个普通的路径名,也就是创建后FIFO的名字。第二个参数与打开普通文件的open()函数中的mode 参数相同。如果mkfifo的第一个参数是一个已经存在的路径名时,会返回EEXIST错误,所以一般典型的调用代码首先会检查是否返回该错误,如果确实返回该错误,那么只要调用打开FIFO的函数就可以了。一般文件的I/O函数都可以用于FIFO,如close、read、write等等。
创建过程:
int fd;
unlink( "zieckey_fifo" );
mkfifo( "zieckey_fifo", 0777);
fd = open( "zieckey_fifo", O_WRONLY );
2.3有名管道的打开规则
有名管道比管道多了一个打开操作:open。
FIFO的打开规则:
如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。
如果当前打开操作是为写而打开FIFO时,如果已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作设置了阻塞标志);或者,返回ENXIO错误(当前打开操作没有设置阻塞标志)。
如果制定了O_NONBLOCK则只读open就立即返回,但是如果偶没有进程已经为写而打开一个FIFO,那么只写open将出错返回-1,ERRNO是ENXIO.
一个给定的FIFO有多个写进程是很常见的,可被原子的写入FIFO的最大数据量是PIPE_BUF
- Linux 进程间通讯(IPC)详细总结 2有名管道。
- Linux 进程间通讯(IPC)详细总结 1管道。
- Linux 进程间通讯(IPC)详细总结 1管道
- Linux进程间通讯--管道(有名管道
- 进程间通信(IPC)2 ------ 有名管道
- 进程间通讯(一) 有名管道
- Day31、未决信号、有名管道、IPC进程间通讯(消息队列)
- 进程间通讯-有名管道
- 进程间的通讯方式_管道(有名管道)
- 进程间通讯——管道(有名管道)
- Linux进程间通讯(IPC)------匿名管道
- Linux 进程间通讯之有名管道方式
- Linux 进程间通讯之有名管道方式
- (四)linux进程通讯方式,无名、标准、有名管道
- 进程间的通讯之有名管道
- 进程间通讯——有名管道
- Linux 进程间通讯(IPC)详细总结 3信号量(Semaphore)。
- Linux 进程间通讯(IPC)详细总结 4消息队列。
- Programming Clojure学习笔记——与Java一起工作
- Word,PDF,PPT,TXT之间的转换方法(
- Linux 进程间通讯(IPC)详细总结 1管道。
- 《大怪兽大战超银河传说》不负责影评
- windows7 virtaul wifi
- Linux 进程间通讯(IPC)详细总结 2有名管道。
- 有关GetCommState() 函数
- TCP与UDP
- Linux 进程间通讯(IPC)详细总结 3信号量(Semaphore)。
- 个人解读Activity之四-Part2-File
- 有关SetupComm()函数
- 线程池创立多线程引发的一些异常记录,待解决
- Linux 进程间通讯(IPC)详细总结 4消息队列。
- sqldeveloper9的注册码