Linux进程间通信(fifo有名管道)

news2024/11/26 5:43:39

文章目录

  • 前言
  • 一、有名管道概念讲解
  • 二、命令行创建fifo
  • 三、非命令行创建fifo
  • 四、fifo和管道对比
  • 总结


前言

上篇文章我们讲解了无名管道,这篇文章我们就来讲解一下有名管道。

一、有名管道概念讲解

有名管道(fifo)

有名管道(FIFO)是一种命名的进程间通信机制,也称为命名管道。不同于无名管道,有名管道具有独立的文件名和文件系统节点,使得无关联的进程能够通过文件系统进行通信。

以下是有名管道的一些特点和使用方法:

1.文件系统中的实体:有名管道是在文件系统中创建的一种特殊文件。它具有文件名和文件属性,可以通过操作系统提供的文件操作接口进行访问和操作。

2.适用于无关进程之间通信:与无名管道不同,有名管道可以被多个无关进程同时访问。这意味着具有适当权限的进程可以通过打开和读写有名管道来进行通信。

3.阻塞和非阻塞操作:有名管道的读取和写入操作可以是阻塞的或非阻塞的,取决于进程对管道文件描述符的设置。阻塞操作将会在读取或写入数据时等待,直到操作可以完成。非阻塞操作会立即返回,无论管道中是否有数据可读或有空间可写。

4.面向字节流的通信:有名管道实现了面向字节流的通信方式。进程可以从管道中读取数据时,读取的字节顺序与写入顺序保持一致。没有消息边界的概念,读取进程需要自行处理数据的分割和组装。

5.持久性:有名管道可以在文件系统中持久存在,与创建它的进程的生命周期无关。这使得进程可以在不同时刻访问管道并进行通信。

6.命令行操作:有名管道可以通过命令行工具(如mkfifo、open等)来创建和操作。可以使用mkfifo命令创建有名管道,并使用open、read、write等命令进行读写操作。

二、命令行创建fifo

使用mkfifo命令来创建fifo
fifo存在的形式和文件是一样的:
在这里插入图片描述
这里来进行两个无亲缘关系的进程间通信:

写进程:

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


int main(void)
{
    int fd;
    char buf[1024];
    int i = 0;

    fd = open("myfifo", O_RDWR);

    if(fd == -1)
    {
        printf("open err\n");
        return -1;
    }

    while(1)
    {
        sprintf(buf,"Hello%d", i++);
        write(fd, buf, strlen(buf) + 1);

        sleep(1);
    }

    return 0;
}


读进程:

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


int main(void)
{
    int fd;
    char buf[1024];
    int len = 0;

    fd = open("myfifo", O_RDWR);

    if(fd == -1)
    {
        printf("open err\n");
        return -1;
    }

    while (1)
    {
        len = read(fd, buf, 1024);
        printf("read buf : %s len : %d\n", buf, len);
    }
    

    return 0;
}


效果:
在这里插入图片描述

三、非命令行创建fifo

mkfifo()是一个C语言库函数,用于创建有名管道(FIFO)。有名管道是一种特殊类型的文件,用于进程间的通信。

该函数的原型如下:

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

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

pathname:要创建的有名管道的路径名称。

mode:有名管道的权限模式。

mkfifo()函数在指定的路径pathname创建一个有名管道文件,并根据mode参数设置其权限模式。

fifo_r.c

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


int main(int argc, char** argv)
{
    int fd;
    char buf[1024];
    int len = 0;

    mkfifo(argv[1], 0666);

    fd = open(argv[1], O_RDWR);

    if(fd == -1)
    {
        printf("open %s err\n", argv[1]);
        return -1;
    }

    while (1)
    {
        len = read(fd, buf, 1024);
        printf("read buf : %s len : %d\n", buf, len);
    }
    

    return 0;
}


fifo_w.c

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


int main(int argc, char** argv)
{
    int fd;
    char buf[1024];
    int len = 0;

    fd = open(argv[1], O_RDWR);

    if(fd == -1)
    {
        printf("open %s err\n", argv[1]);
        return -1;
    }

    while(1)
    {
        write(fd, "I am fifo1", strlen("I am fifo1") + 1);

        sleep(1);
    }

    return 0;
}


运行结果:
在这里插入图片描述

四、fifo和管道对比

1.类型:

管道(无名管道):是一种临时的、基于内存的通信机制,在具有亲缘关系的进程之间进行通信,通常用于父子进程之间的通信。
FIFO(有名管道):是一种命名的管道,可以用于无关进程之间的通信,通过文件系统的文件操作接口进行访问和操作。

2.命名:

管道(无名管道):没有命名,只是由操作系统在调用pipe()函数后自动创建。
FIFO(有名管道):具有独立的文件名和文件属性,在文件系统中创建。

3.通信方式:

管道(无名管道):只能实现单向通信,通常用于一个进程向另一个进程发送数据。
FIFO(有名管道):可以实现双向通信,多个进程可以对其进行读写操作。

4.同步:

管道(无名管道):读写操作是阻塞的,直到有数据可读或有空间可写。
FIFO(有名管道):读写操作阻塞或者非阻塞可以通过文件操作模式来决定。

5.范围:

管道(无名管道):适用于在同一主机上运行的相关进程之间进行通信。
FIFO(有名管道):可以用于无关进程之间的通信,无论它们是否在同一主机上。

6.使用灵活性:

管道(无名管道):在使用前必须调用fork()创建一个子进程,且只能在有亲缘关系的进程之间使用。
FIFO(有名管道):可以在不同的进程之间使用,无论是否有亲缘关系。

总结

本篇文章讲解了fifo有名管道的使用方法,并将有名管道和无名管道做了一个对比。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter请求重试实现思路

文章目录 一、背景二、尝试的解决方案三、最终解决方案&#xff1a;jmeter retrier插件&#xff01; 一、背景 最近系统需要压测一些活动&#xff0c;场景是新建抽奖活动之后&#xff0c;每隔2s查询1次&#xff08;最多3次&#xff0c;3次后还是失败就算失败&#xff09;&…

linux学成之路(基础篇)(二十)rsync服务器

目录 前言 一、概述 监听端口 二、特点 快捷 安全 三、数据的同步方式 四、rsync传输方式 本地传输 远程传输 守护进程 五、命令 作为远程命令 作为rsync服务 选项 六、配置文件 全局配置 模块配置 守护进程传输 七、rsyncinotfy实时同步 一、服务端 二、…

Qgis二次开发-QgsMapLayer(加载矢量、栅格图层)

1.简介 QgsMapLayer是所有地图层类型的基类&#xff0c;这是所有地图层类型(矢量&#xff0c;栅格)的基类&#xff0c;首先定义一个QgsMapCanvas地图画布&#xff0c;然后画布上添加图层&#xff0c;使用以下方法设置图层集合。 //设置当前图层集合 void setLayers (const QL…

算法提高-动态规划-单调队列优化DP

单调队列优化DP AcWing 135. 最大子序和AcWing 1087. 修剪草坪AcWing 1089. 烽火传递AcWing 1090. 绿色通道 关于单调队列的初始化 AcWing 135. 最大子序和 注意hh 0,tt -1 tt 0初始化的时候队列有什么不同&#xff0c;主要还是要理解队列的实际意义 #include <iostre…

利用python绘制二维向量图

为了实现地层数据的变化趋势的可视化模拟&#xff0c;最近研究了python环境下的可视化方案&#xff0c;为后续的流体运动的仿真模拟做好储备&#xff0c;主要采用matplotlib中的quiver函数&#xff0c;实现二维等值线数据的随深度或者地层数据的变化趋势绘制。 一、运行环境&a…

MySQL--主从复制

目录 1.理解MySQL主从复制原理。 2.完成MySQL主从复制。 1.理解MySQL主从复制原理。 1.主要基于MySQL二进制日志 2.主要包括三个线程&#xff08;2个I/O线程&#xff0c;1个SQL线程&#xff09; 概括&#xff1a; 1、MySQL将数据变化记录到二进制日志中&#xff1b; 2、Slave…

【前端动画】点击移动放大出现蒙版,点击蒙版原路返回 css动画animation

<template><div><!-- 蒙版 Mask--><divv-if"isShowTableMask":class"${maskClass}"click"closeTableMask"></div><div style"" class"table-dialog" :class"${centerTableClass} …

Pytorch从入门到精通:二、dataset与datalodar

数据是深度学习的基础&#xff0c;一般来说&#xff0c;数据量越大&#xff0c;训练出来的模型也越强大。如果现在有了一些数据&#xff0c;该怎么把这些数据加到模型中呢&#xff1f;Pytorch中提供了dataset和dataloader&#xff0c;让我们一起来学习一下吧&#xff0c;datase…

AcWing 237. 程序自动分析

输入样例&#xff1a; 2 2 1 2 1 1 2 0 2 1 2 1 2 1 1输出样例&#xff1a; NO YES 解析&#xff1a; 并查集&#xff0c;由于 i, j 数据量为1e9&#xff0c;所以需要离散化。 数组要开2e5个&#xff0c;由于可能每条“约束条件”的数据都不一样。 #include<bits/stdc.h&…

Python-Go python模块与包 - GO问题 - GO容量测试

目录 go 模块与包复习&#xff08;Init函数 - go mod&#xff09; init函数有什么用&#xff1f;init函数是什么&#xff1f; go.mod文件是什么&#xff1f;有什么作用&#xff1f; python的模块与包 python中包的分类 1、内置模块&#xff1a;不需要安装&#xff0c;直接…

和chatgpt学架构04-路由开发

目录 1 什么是路由2 如何设置路由2.1 安装依赖2.2 创建路由文件2.3 创建首页2.4 编写HomePage2.5 更新路由配置2.6 让路由生效 3 测试总结 要想使用vue实现页面的灵活跳转&#xff0c;其中路由配置是必不可少的&#xff0c;我们在做开发的时候&#xff0c;先需要了解知识点&…

lwip-2.1.3自带的httpd网页服务器使用教程(四)POST类型表单的解析和文件上传

上一篇&#xff1a;lwip-2.1.3自带的httpd网页服务器使用教程&#xff08;三&#xff09;使用CGI获取URL参数&#xff08;GET类型表单&#xff09; 在阅读本篇内容之前&#xff0c;请修改httpd.c文件&#xff0c;修复lwip自带httpd服务器里面关于post的一个bug&#xff1a;bug…

系统集成|第一章(笔记)

目录 第一章 信息化知识1.1 信息与信息化1.1.1 信息1.1.2 信息系统1.1.3 信息化1.1.4 国家信息化体系要素 1.2 国家信息化战略和规划1.3 电子政务1.4 企业信息化和两化深度融合1.4.1 企业信息化1.4.2 企业应用集成1.4.2.1 电子商务系统1.4.2.2 企业资源规划系统1.4.2.3 客户关系…

【Java】 服务器cpu过高如何排查和解决?

文章目录 前言一、常见能够引起CPU100%异常的情况都有哪些&#xff1f;二、服务器CPU使用率飙升异常&#xff0c;黄金4步排查法三、排查 CPU 故障的常用命令四、什么场景会造成 CPU 低而负载确很高呢&#xff1f;五、监控发现线上机器内存占用率居高不下&#xff0c;如何分析进…

两个数组的dp问题--动态规划

一)最长公共子序列: 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 一)定义一个状态表示:根据经验题目要求 1)选取第一个字符串[0&#xff0c;i]区间以及第二个字符串[0&#xff0c;j]区间作为研究对象&#xff0c;先选取两段区间研究问题&#xff0c;先求出[0…

redis(8):java连接redis

1 Jedis所需要的jar包依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.1.0</version></dependency> 2 Jedis常用操作 2.1 测试连通性 package com.example.demo;import redis.…

手写Spring,理解SpringBean生命周期

按照Spring使用习惯&#xff0c;准备环境 ​ 首先&#xff0c;写一个TigerApplicationContext&#xff0c;模拟Spring的Annotation Application。然后写一个config&#xff0c;接着写一个UserService。 由于Spring需要扫描bean&#xff0c;所以我们得定义一个扫描注解Componen…

【C++】-priority_queue(优先级队列的具体使用和模拟实现)以及仿函数的简单介绍

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

ubuntu 开启 ssh 服务 设置root远程登录

设置root用户密码 sudo passwd root安装ssh服务和vim编辑器 sudo apt -y install openssh-server vim开启ssh服务 sudo vim /etc/ssh/ssh_config去掉 配置文件中 Port 22 的注释后保存退出 设置root用户远程登录 sudo vim /etc/ssh/sshd_config将 PermitRootLogin prohibit-pas…

文章审核之敏感词过滤

技术选型 DFA实现原理 DFA全称为&#xff1a;Deterministic Finite Automaton,即确定有穷自动机。 存储&#xff1a;一次性的把所有的敏感词存储到了多个map中&#xff0c;就是下图表示这种结构 敏感词&#xff1a;冰毒、大麻、大坏蛋 工具类 最下面的main方法是测试用的&a…