进程间通信之FIFO

Linux进程间通信-fifo测试 1:fifo原因有名管道文件:安全性,不自动化,数据不完整没有保障;锁的机制PHP开发网站的时候,登录,session2:测试mkfifo \\192.168.0.155\ncc\fifo_write.c \\192.168.0.155\ncc\fifo_read.c其中:fifo_write.c#include<stdio.h> #include<stdlib.h> #i... 阅读详情

FIFO俗名叫 命名管道(有名管道),是进程间通信的一种方法。其实,所谓的管道,就是内核里面的一块缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。另外,管道传输的数据是无格式的流且大小受限。第二个参数为管道权限,一般设置为0666就可以了,即管道文件有读®写(w)权限,不需要执行(x)权限。
区别于pipe(匿名管道),在pipe中,我们可以使用 fork 创建子进程,创建的子进程会复制父进程的文件描述符,这样就做到了两个进程各有两个fd[0](读端) 与 fd[1](写端),两个进程就可以通过各自的 fd 写入和读取同一个管道文件实现跨进程通信了。管道只能一端写入,另一端读出,所以上面这种模式容易造成混乱,因为父进程和子进程都可以同时写入,也都可以读出。为了避免这种情况,所以通常的做法是:
父进程关闭读取的 fd[0],只保留写入的 fd[1];
子进程关闭写入的 fd[1],只保留读取的 fd[0];
然后父进程写,子进程读。
但是,pipe由于需要fork创建进程,所以它只能用在父子进程间的通信,无法在不相关的进程间通信,因此有了FIFO。

对于命名管道FIFO,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。大致示意图如下

有一点需要强调:

不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。

FIFO的阻塞与非阻塞

使用open函数打开fifo时,第二个参数有一个非阻塞标志(O_NONBLOCK),有以下几种情况需要注意:“”
1、不指定O_NONBLOCK时:
① open以只读方式打开FIFO时,要阻塞到某个“写”进程启动时才会运行。
②open以只写方式打开FIFO时,要阻塞到某个"读"进程启动时才会运行。
③open以只读、只写方式打开FIFO时会阻塞,调用read函数从FIFO里读数据时read也会阻塞。
④调用write函数向FIFO里写数据,当缓冲区已满时write也会阻塞。

2、指定O_NONBLOCK时
①以只读方式(O_RDONLY | O_NONBLOCK)打开fifo,即便没有"写"进程启动,open也不会阻塞。
②以只写方式(O_WRONLY | O_NONBLOCK)打开fifo,如果没有‘’读”进程启动,open会出错:open: No such device or address。
③read、write读写管道中的数据时不会阻塞。

下面看一下操作系统提供的操作有名管道的一些API:
① 创建fifo
有两个方法:

  1. 直接在命令行输入mkfifo 管道名称。
  2. 调用mkfifo函数进行创建。
       #include <sys/types.h>
       #include <sys/stat.h>

       int mkfifo(const char *pathname, mode_t mode);
       第一个参数为管道的路径
       第二个参数为管道的权限,一般设置为0666就可以了,即管道文件有读(r)写(w)权限,没有执行(x)权限。 

如下图创建一个fifo
下面看一个简单的例子,写两个函数,一个用于往管道中写数据,另一个往管道中读数据,实现不同进程间的通信。

进程1(写数据)

#include <iostream>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <chrono>
#include <sys/types.h>
#include <sys/stat.h>
#include <thread>
using namespace std;


int main(int argc, const char* argv[]){
    if(argc < 2){ 
        cout << "参数为管道名称" << endl;
        exit(-1);
    }   
    int fd = open(argv[1], O_RDONLY);
    
    char buf[20];
    int ret = 1;
    while((ret = read(fd, buf, sizeof(buf))) > 0){ 
        if(strcmp(buf, "") != 0){ 
            cout << "读取到: " << buf;
        }   
        memset(buf, 0, sizeof(buf));
    }   
    cout << "数据已被读取完毕, 进程退出!" << endl;
    return 0;
}                  

进程2(写数据)

#include <iostream>
#include <string.h>                                                 
#include <unistd.h>
#include <fcntl.h>
#include <chrono>
#include <sys/types.h>
#include <sys/stat.h>
#include <thread>
using namespace std;

int main(int argc, const char* argv[2]){
    int fd = open(argv[1], O_WRONLY);
    if(argc < 2){
        cout << "需要一个参数: 管道名称" << endl;
        exit(-1);    
    }
    if(fd < 0){
        perror("open");
    }

    char buf[100];
    int i = 1;
    while(i < 50){
        memset(buf, 0, sizeof(buf));
        sprintf(buf, "第%d条数据\n", i++);
        cout << "写入: " << buf;
        write(fd, buf, sizeof(buf));
        this_thread::sleep_for(chrono::milliseconds(3);
    }
    close(fd);
    return 0;                                                                
}

010进程间通信 pipe、fifo、文件 linux 进程通信 阅读详情

相关推荐

Linux进程间通信—FIFO有名管道

Linux进程间通信—FIFO有名管道 有名管道又称FIFO,是一种特殊的文件。FIFO是能够实现在不同进程下的通信,速度极快。在Linux下面一切皆文件,这让许多操作变得更加简单便捷。 (1)FIFO的创建 FIFO的创建可由下面函数来创建 其中第一个参数*pathname是FIFO创建的路径名,第二参数mode是什么样的读写权限来创建FIFO。 (2)打开FIFO文件 FIFO文件和其他文...

weixin_40587410的博客 416

进程间通讯——FIFO篇

进程间通讯——FIFO有名管道 管道没有名字,只局限于有共同祖先进程的各个进程之间。FIFO不同于管道的是有一个路径名与之相关联,允许无亲缘关系的进程访问同一个FIFO。由于FIFO是半双工的,因此FIFO不能打开来既读又写。 注: 1、创建并打开一个管道只需要调用pipe;创建并打开一个FIFO则需在调用mkfifo后再用open; 2、管道在所有进程最终关闭它之后自动消失,FIFO的名字只能通过调用unlink才从文件系统中删除。 FIFO由mkfifo函数创建: #include<sys/st

weixin_42734533的博客 2316

linux进程间通信-FIFO,让你全方位理解

这个问题的解决方法,就是让写操作的原子化。对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY | O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。2就是传递给open调用的是FIFO的路径名,而不是正常的文件。

m0_70888041的博客 800

使用fifo文件实现进程间通信

fifo 文件是一种先进先出的特殊文件,即命名管道。从man7 上可以看到 fifo 的相关信息,摘抄如下: A FIFO special file (a named pipe) is similar to a pipe, except that it is accessed as part of the filesystem. It can be opened by multiple processes for reading or w...

choumin的专栏 1236

别再手动调波形了!用STM32G474的HRTIM+DAC生成精密锯齿波,附完整CubeMX配置

本文详细介绍了如何利用STM32G474的高分辨率定时器(HRTIM)和数模转换器(DAC)协同工作,实现高精度锯齿波生成。通过CubeMX配置指南、关键寄存器计算和实践技巧,帮助开发者快速掌握全硬件实现的波形生成方案,显著提升嵌入式系统的波形控制精度和响应速度。

weixin_28716769的博客 246

Cherry Studio 新手必看:5分钟搞定MCP服务器配置(附常见问题解决)

本文为Cherry Studio新手提供了详细的MCP服务器配置指南。文章从核心概念入手,解释了Cherry Studio作为MCP客户端如何通过MCP协议安全、标准化地扩展AI助手能力。重点讲解了uv和Bun环境的安装与常见网络问题的解决方案,并演示了如何添加首个MCP服务器(如mcp-server-fetch),助你快速构建可扩展的智能工作流。

corn8的博客 595

进程间通信(二) FIFO

FIFO是用来标识一段内核空间,区别于pipe, 可以实现非血缘关系进程间通信的伪文件。

longjiang321的博客 1374

学习海康VisionMaster之顶点检测

2:应用场景:海康VisionMaster的顶点检测功能在工业视觉检测中具有广泛的应用场景,尤其在精密制造、电子元件检测和机械加工等领域,其通过高精度定位物体的关键点(如角点、交点或边缘顶点)来实现自动化测量与质量控制。基本参数这里就是画ROI,设定跟踪参数和之前的工具是一样的方法,这里画的方向需要注意,如下图所示,边缘的扫描方向正好对应需要查找的边缘点。一个不是很规则的物体需要检测一个凸台的顶角坐标,其实靠边缘与边缘交点是不太稳定的,如下图所示,边缘很短,很容易产生误抓边缘。1:什么是顶点检测?

yuhouxiyang的专栏 1521

STM32F103RCT6 CAN1 同时开启FIFO0和FIFO1 用于接收两帧扩展数据帧

最近STM32芯片的价格真是达到宇宙洪荒的地步,前几天刚刚咨询了一下之前一直合作的供货商,报价200元人民币一片,你没有看错,就是200元人民币一片,一片啊。只能用疯了来形容了。 最近有个项目需要同时接收两帧扩展数据帧,实际上是卡车上国六配备的尿素箱里头的传感器总成。 ...

weixin_43276165的博客 7111

大疆sdkV4以及V5webrtc推流

webrtcSDK中要用它的VideoCapturer来初始化推流 ViewdoCapturer是一个接口我们继承它 然后重建创建文件CapturerAircraft.java文件。CameraUtil.java这个是我们用来创建CapturerAircraft的一个工具。除了CapturerAircraft这个文件不一样外其他都是一样的。PlayBodyBean.java这个是我们的配置文件。下面的有个代码块第一个是v4的 第二个是v5的。接着我们来创建几个推流用到的webrtc工具。

weixin_41624865的博客 1187

华中科技大学计算机组成原理-单总线CPU设计(全部通关)

【计算机组成原理】 单总线CPU实验 华中科技大学-计算机组成原理 实验三 单总线CPU设计 第1关 MIPS指令译码器设计 第2关 单总线CPU微程序入口查找逻辑 第3关 单总线CPU微程序条件判别测试逻辑 第4关 单总线CPU微程序控制器设计 第5关 采用微程序的单总线CPU设计 第6关 现代时序硬布线控制器状态机设计 第7关 现代时序硬布线控制器设计

紫荆鱼的博客 4万+

进程间通信fifo

进程间通信之命名管道fifo命名管道fifo()fifo_write.cfifo_read.c命名管道fifo() FIFO可以用于没有血缘关系的进程间通信。FIFO是Linux基本文件类型的一种,文件类型为p。 简单来说,FIFO可以理解为一个特殊的文件,创建它之后,可以使用 ls或ll来进行查看文件基本信息。 F...

qq_35485206的博客 332

电拖笔记1电磁学基本知识与定律

电拖学习

qq458629839的博客 1131

进程间通信1——管道、FIFO

首先了解几个名词:1. 进程隔离进程隔离是为保护操作系统中进程互不干扰而设计的一组不同硬件和软件的技术。这个技术是为了避免进程A写入进程B的情况发生。进程的隔离实现,使用了虚拟地址空间。进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B。2.虚拟地址空间就32位系统而言,当创建一个进程时,操作系统会为该进程分配一个 4GB 大小的虚拟进程地址空间。之所以是 4GB ,是因为在 32 位的操作系统中,一个指针长度是 4 字节,而 4 字节指针的寻址能力是从,最大值。

2401_84313943的博客 1018

【华为OD技术面试真题 - 技术面】- python面试题(1)

华为OD面试技术面准备指南 华为OD面试技术面常见问题解答 华为OD面试技术面经验分享 华为OD面试技术面注意事项 华为OD面试技术面攻略 华为OD面试技术面模拟题目与解析 华为OD面试技术面知识点梳理 华为OD面试技术面常考

算法大师! 5532

SpringBoot4.0+JDK25+GraalVM实战:云原生新纪元,微服务性能翻倍的落地指南

三者的组合不是偶然,而是“框架优化+JDK升级+虚拟机革新”的必然结果——SpringBoot4.0完善了对GraalVM原生镜像的支持,JDK25强化了云原生与AOT编译能力,GraalVM则提供了极致的启动速度和资源利用率,三者协同,刚好命中云原生微服务的核心痛点。SpringBoot4.0+JDK25+GraalVM的组合,不是简单的版本升级,而是云原生微服务的一次性能革命。

2601_94871597的博客 1140

进程间通信之管道pipe与fifo

管道pipe()和fifo()的创建和使用

qq_43460315的博客 1236

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Linux进程间通信-FIFO命名管道

要创建和打开管道,只需调用pipe。创建和打开一个FIFO,在调用mkfifo后还需要使用open;管道在所有进程最终关闭后自动消失,只有通过调用unlink才能从文件系统中删除FIFO名称。创建FIFO文件时会锁定文件的写入权限,只有创建者才有资格写入。

嵌入山脊的博客 6221

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Linux进程间通信】三、FIFO命名管道

Linux进程间通信专题:FIFO命名管道。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 1581

linux进程间通信之FIFO

一.FIFO       虽然有名管道在亲缘进程间非常方便,但由于它没有名字所以使用范围非常有限。FIFO不同于有名管道之处在于它提供一个路径名与之关联,以FIFO文件的形式存在于文件系统中。这样只要其它进程可以访问该路径,就能与创建FIFO的进程通过FIFO进行通信。       FIFO严格遵循先进先出,对管道及FIFO的读总是从开始处返回数据,对它们写则在末尾添加数据。它们不支持诸如ls

hjj_1015的专栏 1021

进程间通信(FIFO管道)

FIFO常被称为命名管道,以区分pipe,pipe只能用于“有血缘关系”的进程间通信。但通过FIFO,不相关的进程也能交换数据。 FIFO是linux基础文件类型中的一种(文件类型为p,可通过ls -l查看文件类型),但FIFO文件在磁盘上没有数据块,文件大小为0,仅仅用来标识内核中一条通道。进程可以打开这个文件进行read/write,实际上是在读写内核缓冲区,这样就实现了进程间通信。 创建FIFO管道 进程间通信流程 进程A 创建一个fifo文件,使用mkf...

qq_41606926的博客 541

进程间通信——有名管道fifo

1、区别于pipe,FIFO可以在无关进程间进行通信。2、FIFO有路径名与之相关联,是一种特殊的设备文件,存在文件系统中。FIFO产生的文件可以open,pipe产生的则不可以。

init_hello的博客 255

进程间通信 管道和FIFO

<!-- @page {margin:2cm} pre {font-family:"文泉驿微米黑"} p {margin-bottom:0.21cm} --> 进程间通信 管道和FIFO 管道,顾名思义就是像水管一样,水管是用来流通水的,而对与管道来说,做为进程间通信的一种方式,传送的是数据而已。对于管道来说,没有名字,在程序内部以标识符进行识别,这也就注定了管

1374

进程间通信--FIFO命名管道

管道没有名字,所以只能在具有血缘关系的进程间使用,而在无名管道发展出来的有名管道FIFO,则有路径名与之相关联,以一种特殊设备文件形式存在于文件系统中,从而允许无亲缘关系的进程访问FIFO,下面看FIFO的详细操作 1.FIFO的建立 FIFO是存在于文件系统的文件节点,所以我们可以建立文件节点的mknod系统用来建立它,也可以mkfifo系统调用 mkfifo说明: #i

小青年儿 1065

linux fifo通信,linux系统编程:进程间通信-fifo

进程间通信-fifo进程间通信的还有一种方式是fifo。fifo是还有一种管道:有名管道。从名字能够看出。它也是队列。使用fifo通信前,得先创建fifo$ mkfifo myfifo随后仅仅需对myfifo像文件一样使用即可。fifo_w.c#include #include #include #include #include #include struct stu{int id;char n...

weixin_39708822的博客 223
上一篇: C++实现-用三个线程分别打印’A’、’B’、’C’,线程1打印A,线程2打印B,线程3打印C,请实现三个线程同时启动并协作始终打印 ABCABCABC….
下一篇: VS2017网络编程中bind冲突问题
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值