LINUX FIFO(读书笔记,LINUX程序设计第四版)
1.创建FIFO文件
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int res = mkfifo("/tmp/my_fifo", 0777);
if (res == 0)
printf("FIFO created\n");
exit(EXIT_SUCCESS);
}
qiujiahong@ubuntu:~/ch13$ gcc -o fifo fifo1.c
qiujiahong@ubuntu:~/ch13$ ./fifo
FIFO created
qiujiahong@ubuntu:~/ch13$ cd /tmp/
qiujiahong@ubuntu:/tmp$ ls my*
my_fifo
2.打开FIFO
打开FIFO可以用open函数打开FIFO,但是需要注意不能用O_RDWR方式打开,因为一个FIFO文件始终是单向的。
open(const char * path,O_RDONLY) //这种情况open进程将会打开,除非一个进程以写的方式打开改FIFO;
open(const char * path,O_RDONLY | O_NONBLOCK)//即使没有其他进程打卡改FIFO这个open也将成功并立即返回;
open(const char *path,O_WRONLY )//这种情况open将阻塞,直到一个进程以阻塞的方式打开该FIFO
open(const char *path,O_WRONLY | O_NONBLOCK)//这个函数将会立刻返回,但是如果没有进程以只读方式打开FIFO文件,将会返回一个错误;
3.读写FIFO
使用O_NONBLOCK模式会影响到FIFO的read和write;
对于一个空的、阻塞的FIFO(没有O_NONBLOCK标志)的read调用将等待,知道有数据可以读才继续执行,与此相反,对于一个空的,阻塞的FIFO的read调用将会立即返回0字节。
对于一个完全阻塞的write调用将等待,知道数据可以被写入时才继续执行,如果FIFO不能接收所有写入数据,将会执行如下规则:
如果请求写入的数据长度小于等于PIPE_BUF,调用失败数据不能写入。
如果请求写入的数据长度大于PIPE_BUF字节,将写入部分数据,返回实际写入数据,返回值也可能是0。