首页 > 其他分享 >有名管道介绍及使用

有名管道介绍及使用

时间:2023-04-06 12:33:09浏览次数:32  
标签:文件 int FIFO 管道 有名 介绍 include

有名管道简介:

  • 匿名管道,由于没有名字只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道(FIFO),也叫命名管道、FIFO文件。
  • 有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存在于文件系统中,并且其打开方式和打开一个普通文件是一样的。这样即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问路径,就能够彼此通过FIFO相互通信。因此,通过FIFO,不相关的进程也能交换书就。
  • 一旦打开了FIFO,就能在它上面使用与操作匿名管道和其他文件的系统调用一样的I/O系统调用了(如read()\write()\close())。与管道一样,FIFO也有一个写入端和一个读取端并且从管道中读取数据的顺序与写入数据的顺序一致。
  • 有名管道(FIFO)和匿名管道(pipe)有一些特点是相同的,不一样的地方在于:
    1. FIFO文件系统中作为一个特殊文件存在,但FIFO中的内容却放在内存中。
    2. 当使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便以后使用。
    3. FIFO有名字,不相关的进程可以通过打开有名管道进行通信。

有名管道的使用:

  • 通过命令创建有名管道

    mkfifo [name]  
    
  • 通过函数创建有名管道

#include <sys/types.h>
#include <sys/stat.h>

  int mkfifo(const char *pathname, mode_t mode);

  • 一旦使用mkfifo创建了一个FIFO,就可以使用open打开它。常见的文件I/O函数都可用于FIFO。
  • FIFO严格遵循先进先出(First in First out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它不支持诸如lseek()等文件定位操作。
有名管道的注意事项:
        当只打开读端或者写端的时候,管道会产生阻塞,直到管道的另一端打开

    读管道:
        管道中有数据,read返回读到的字节数
        管道中无数据:
            管道写端被全部关闭,read返回0(相当于读到文件末尾)
            管道写端没有全部关闭,read阻塞等待

    写管道:
        管道读端被全部关闭,进行异常终止(收到一个SIGPIPE信号)
        管道读端没有被完全关闭:
            管道已经满了,write会阻塞
            管道没有写满,write将写入数据,返回写入的字节数

下面是关于没有亲缘关系的两个进程之间的通信简单案例:

//向管道中写数据

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <fcntl.h>
#include <string.h>


using std::cout;
using std::endl;


int main(){

    

    //判断文件是否存在
    int ext = access("test",F_OK);
    if(ext == -1){
        cout << "管道不存在,创建管道!" << endl;

        //如果不存在,创建管道
        int ret = mkfifo("test",0664);
    
        if(ret == -1){
            perror("mkfifo");
            exit(0);

        }
    }

    //打开管道,向管道里写入数据
    int fd = open("test",O_WRONLY);
    if(fd == -1){
        perror("open");
        exit(0);
    }
    char buf[1024];
    for(int i=0; i<20;++i){
        sprintf(buf,"hello, %d\n",i);
        write(fd,buf,strlen(buf));
        sleep(1);
    }

    close(fd);
    return 0;
}
//从管道中读数据


#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <fcntl.h>
#include <string.h>


using std::cout;
using std::endl;

int main(){

    //打开管道文件
    int fd = open("test",O_RDONLY);
    if(fd == -1){
        perror("open");
        exit(0);
    }

    //读数据
    char buf[1024];
    while(1){

        int len = read(fd,buf,sizeof(buf));
        if(len == 0){
            cout << "写端关闭..."<<endl;
            break;
        }
        cout << "buf: "<<buf<<endl;
        memset(buf,0,1024);
    }
    
    close(fd);

    return 0;
}

标签:文件,int,FIFO,管道,有名,介绍,include
From: https://www.cnblogs.com/nakjima/p/17284408.html

相关文章

  • HMI人机界面相关介绍及人机界面设计
    在工业自动化领域,HMI是人机界面的缩写。在工业中使用HMI来控制和监控机器。如果没有HMI,就很难在工业中拥有良好的自动化流程。人机界面的定义人机界面(HMI)是一种用户界面,允许人类操作员与机器或过程进行交互。HMI通常用于工业环境,允许操作员监视和控制过程,例如工厂或发电厂中......
  • C++/CLI 托管C++的数组介绍【4】
    Git源码地址 C++/CLI托管C++的托管与非托管字符串的相互转换【1】C++/CLI托管C++的数据类型介绍【2】C++/CLI托管C++的基本数据类型及函数【3】C++/CLI托管C++的数组介绍【4】C++/CLI托管C++之字符串封装【5】C++/CLI托管C++之enum枚举封装【6】C++/CLI托管C++之类、属性......
  • LinkedBlockingDeque介绍
    //有一个内部类finalclassNode<E>,//用于包装每个节点的数据。另外有成员属性//Node<E>first,Node<E>last,//当前拥有元素数量intcount,容量intcapacity;//Eitem当前节点数据//Node<E>prev指向当前节点前驱节点......
  • BPM工作流引擎常见的术语和概念介绍
    本文重点介绍BPM业务流程管理中常常用到概念和术语,这些概念同样适用于JBPM、Activiti、Flowable、Camunda等主流的开源流程引擎。一、BPM模型符号协议1、BPMN(业务流程模型和标记法)BPMN:业务流程模型和标记法(BPMN,BusinessProcessModelandNotation)是一套图形化表示法,用......
  • yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)
    yaml-cppYAML格式处理库的介绍和使用(面向业务编程-文件格式处理)YAML格式介绍YAML的格式介绍,有关ini、json和xml或许很多人已经很了解了,但是关于YAML,还有许多人不了解。YAML被设计成更适合人类阅读(我想正因为如此,所以相对来说更灵活,就导致到使用的时候很多人会觉得它看起来并不......
  • 进程间通信方式--匿名管道通信
    管道的特点管道其实是一个在内核内存中维护的缓冲器,这个缓冲器的存储能力时有限的,不同的操作系统大小不一定相同。管道拥有文件的特质:读操作、写操作,匿名管道没有文件实体,有名管道由文件实体,但不存储数据。可以按照操作文件的方式对管道进行操作。一个管道是一个字节流,试用管......
  • JsonCpp JSON格式处理库的介绍和使用(面向业务编程-文件格式处理)
    JsonCppJSON格式处理库的介绍和使用(面向业务编程-文件格式处理)介绍JSON是一种轻量级的数据交换格式,它是一种键值对的集合。它的值可以是数字、字符串、布尔值、序列。想知道更多有关JSON格式的介绍,可以到JSON的官网json.org学习JsonCpp是一个c++库,允许对JSON值进行操作,包括......
  • flask框架01 flask与pythonweb框架介绍 flask快速使用 登录显示用户信息案列 配置
    今日内容详细目录今日内容详细1Flask和pythonweb框架介绍1.1flask介绍2flask快速使用3登录,显示用户信息小案例3.1login.html3.2home.html3.3detail.html3.4py文件4配置文件方式5路由系统5.1转换器1Flask和pythonweb框架介绍pythonweb框架的本质都一样1.同步框架......
  • flask:Flask 和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件
    目录一、Flask和pythonweb框架介绍1.1pythonweb框架介绍1.2flask介绍1.3wsgiref1.4用wsgirf和werkzeug写web二、flask快速使用三、登录,显示用户信息小案例3.1login.html3.2home.html3.3detail.html3.4py文件3.5知识点总结四、配置文件的使用方式1、设置方式一(测试中使用的......
  • 堆块chunk介绍及unlink漏洞利用原理
    堆块chunk介绍及unlink漏洞利用原理chunk结构当进程动态分配内存时,系统会在堆中创建一个chunk(堆块)。chunk包含chunk头和chunk体两部分chunk头中有两个字段:prev_size:前一个chunk的size,前指的之前分配的内存,也就是低地址相邻的chunksize:当前chunk的size,size字段的低3位A,M,P不......