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。

单片机,嵌入式LINUX技术交流群:142282597
原文地址:https://www.cnblogs.com/qiujiahong/p/3131951.html