FIFO管道探索历程

  1. 刚开始代码的实现如下:

    void CreateFIFO()
    {
        if((mkfifo(FIFOPATH,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST))
        {
            printf(strerror(errno));
        }   
    }

    int OpenFIFO()
    {
        fd=open(FIFOPATH,O_RDWR|O_NONBLOCK);
        return fd;
    }

觉得非常的不优雅,毕竟需要调用两个函数,而且写函数又有一个调用write

2现在使用正确的指导:

//mkfifo函数已经隐含指定O_CREAT|O_EXCL,也就是说,它要么创建一个新的FIFO,要么
    //返回一个EEXIST错误(如果所指定名字的FIFO已经存在)。如果不希望创建一个新的FIFO
    //那么就改调用open而不是mkfifo,要打开一个已存在的FIFO或者创建一个新的FIFO,应
    //先调用mkfifo,在检查它是否返回EEXIST,若返回该错误改为调用open
    //mkfifo命令也能创建FIFO,可以从SHELL脚本或命令行中使用它

int OpenFIFO(const char* pszFIFOPath)
{
    int fd=-1;
    if((mkfifo(pszFIFOPath,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST))
    {
        printf(strerror(errno));
    }
    fd=open(pszFIFOPath,O_RDWR|O_NONBLOCK);
    return fd;
}

时间: 2024-12-15 05:00:25

FIFO管道探索历程的相关文章

FIFO管道

1.mkfifo -m 777 fifo1 :  创建一个有名管道,权限是777 2.可以实现无关进程间的通信,克服了匿名管道的缺陷 3.,管道文件最前面是 p 4.管道文件传输信息类似于文件,但又区别于普通文件,管道文件在数据读出后,管道中就会同时清除数据 5.函数创建管道: #include<stdio.h> #include<sys/stat.h> #include<sys/types.h> #include<stdlib.h> int main(in

bash fifo管道使用测试例子

碰到一个场景: 一个脚本内起了多个后台线程,往一个日志文件写日志,结果因为线程之间争抢写锁,导致脚本执行效率很低,为了解决这个问题,希望减少写锁的争抢,尝试使用fifo解决该问题,以下是实验用例子. #!/bin/bashfifo_file=fifo.pipe mkfifo $fifo_file exec 6<>$fifo_file rm $fifo_file # 随便一个写了一个生成数据的函数 DateWrite () { i=0 while [ $i -lt 1000 ] do str=`

Vue探索历程(一)

使用vue.js原文介绍:Vue.js是一个构建数据驱动的web界面库.Vue.js的目标是通过尽可能简单的API实现响应式数据绑定和组合的视图组件.vue.js上手非常简单,先看看几个例子: 例一:Helloworld html代码: let arr = [1,2,3] <div id="app"> {{ message }} </div> js代码: new Vue({ el: '#app', data: { message: 'Hello Vue.js!'

管道和FIFO

管道和FIFO 管道(pipe) 管道在Unix及Linux进程间通信是最基础的,很容易理解.管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动.管道是典型的单向通信,即计算机网络中所说的“半双工”.管道又名匿名管道,所以只能用在具有公共祖先的进程之间使用,通常使用在父子进程之间通信.通常是父进程创建一个管道,然后fork一个子进程,此后父子进程共享这个管道进行通信. 管道由pipe函数创建,函数原型如下: #include<unistd.h> int pip

进程之间通信之有名管道、无名管道(pipe),笔记

             进程之间的通信作用1.数据传输   :一个进程需要将他的数据传到其他进程2.资源共享3.进程通知事件4.进程控制 :有些进程完全控制另一个进程的执行,如调试状态啊我们需要完全控制他的每一步操作: 通信发展历史Linux进程间的通信IPC由以下几个部分发展而来:1.UNIX进程之间的通信2.基于system v进程间的通信3.POSIX进程之间的通信(portable operating system interface) 现在Linux使用的进程间的通信方式包括:1.管

unix 网络编程卷2 第43页 管道:open竟然会阻塞?

创建fifo管道的时候,open会阻塞?还是我的代码有问题? #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <sys/types.h> #Include <sys/stat.h> #define FIFO1 "/tmp/fifo.1" #define FIFO2 "/tmp/fif

14.有名管道通信

有名管道: 有名管道又称为FIFO文件,因此我们对有名管道的操作可以采用操作文件的方法,如使用 open,read,write等. 有名管道的学习: ? 有名管道与其他文件的对比: FIFO文件在使用上和普通文件有相似之处,但是也有不同之处: 1. 读取Fifo文件的进程只能以"RDONLY"方式打开fifo文件. 2. 写Fifo文件的进程只能以"WRONLY"方式打开fifo文件. 3. Fifo文件里面的内容被读取后,就消失了.但是普通文件里面的内容读取后还存

linux 进程间通信 之fifo

上一篇博客已经介绍了一种进程间通信的方式,但是那只是针对于有血缘关系的进程,即父子进程间的通信,那对于没有血缘关系的进程,那要怎么通信呢?  这就要创建一个有名管道,来解决无血缘关系的进程通信, fifo: [email protected]:~$ mkfifo xwp [email protected]:~$ ls -l myfifo prw-rw-r-- 1 book book 0 Feb 6 2016 myfifo mkfifo 既有命令也有函数 #include <sys/types.h

Linux进程间通信-命名管道

前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流的空间,只能用于父子关系的进程之间.因为父子进程的输入和输出文件描述符是一致的.命名管道是一种实际存在的FIFO文件,称作“管道文件”,用于不同进程之间,命名管道进程间打开同一个FIFO文件,进行数据传递.我们可以像普通文件一样操作FIFO文件.不同进程,引用同一个FIFO文件,进行数据传递. 2.