看了进程间通信,学习了管道,下面是我的一点理解:
1.在程序的开头定义一下文件名,可以包含路径如#define FIFO_SERVER "/tmp/fifoserver"也可不包含路径如char write_fifo_name[]="write-fifo";可以用宏定义,也可以用字符串,这个定义不是必须的,但是在开头定义一下会使程序条理清楚。
2.一个程序中可以创建多个不同的FIFO。
3.用mkfifo函数创建FIFO,函数说明如下:
mkfifo(建立实名管道)
相关函数
pipe,popen,open,umask
表头文件
#include
#include
定义函数
int mkfifo(const char * pathname,mode_t mode);
函数说明
mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此
umask值也会影响到FIFO文件的权限。Mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开
FIFO文件时,O_NONBLOCK旗标会有影响
1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。
2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。
返回值
若成功则返回0,否则返回-1,错误原因存于errno中。
错误代码
EACCESS 参数pathname所指定的目录路径无可执行的权限
EEXIST 参数pathname所指定的文件已存在。
ENAMETOOLONG 参数pathname的路径名称太长。
ENOENT 参数pathname包含的目录不存在
ENOSPC 文件系统的剩余空间不足
ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。
EROFS 参数pathname指定的文件存在于只读文件系统内。
4.创建完成后,在使用之前,要用open函数打开创建的fifo,成功返回0,失败返回-1
5.如果有两个程序要进行交互,则要创建两个fifo, 一个读,一个写,在相应的另一个程序中是写和读。
6.注意读写原子性,还有阻塞位。具体内容参照:http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html
7.往fifo中写,和从fifo中读,用write 和read函数,成功则返回读入写入的字节数,失败则返回-1.
8.关于打开规则,fifo的读打开和写打开之间存在依赖,要同时存在。
不明白的问题:阻塞位是在读写自动应用的,可不可以人为控制呢?
阅读(1982) | 评论(1) | 转发(0) |