zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    换种方式思考问题
    win7 下的open live writer代码插件
    vue-todolist
    vue-新建项目出错情况分析
    vue新建项目
    AJAX(一、基本知识)
    2016年度工作总结
    常看常遇见之一——BS架构VS CS架构
    thinkjs——session
    关于Listener
  • 原文地址:https://www.cnblogs.com/qiujiahong/p/3131951.html
Copyright © 2011-2022 走看看