【hello Linux】进程间通信——命名管道

news2025/1/23 22:42:50

目录

 1. 命令行的命名管道

 2. 命名管道

 1. 命名管道的创建

 2. 命名管道的使用


Linux🌷 

在上篇中我们说到,可以使用匿名管道完成父子进程间的通信,它是让子进程继承父进程,从而达到让两个进程看到同一份资源;

如果我们想让两个互不相关的进程间进行通信,我们应该使用命名管道,也就是这篇博客所讲的内容!它是利用 路径+文件名 确定唯一的文件,从而使两个独立的进程看到同一份资源;

先来看一下在命令行中两进程的相互通信:

 1. 命令行的命名管道

1. 我们可以使用 mkfifo 文件名 创建命名管道文件;

 经过查看此文件标识以p开头,是一个管道文件;

2. 利用管道文件进行进程间通信;

 2. 命名管道

 1. 命名管道的创建

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

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

pathname:管道文件的路径+管道文件名;

mode:管道文件的权限;

返回值:管道文件创建成功返回0,创建失败返回-1,并设置错误码;

上述内容如果忘记的话,在Linux中,可以使用 man 3 mkfifo 查询mkfifo函数的具体使用方法;

创建示例: 

上述中,我们在当前目录下创建了一个管道文件,并将它的权限设置为666,经过查看我们发现创建的fifo管道文件权限是664,其实这是因为受了权限掩码umask的影响;

为避免受权限掩码的影响,我们在创建管道文件前,可以使用umask(0),将权限掩码至0;

注意:这次设置只是设置当前程序的权限掩码,不影响整个系统;

 2. 命名管道的使用

1. 使用命名管道进行进程间数据的传送;

结果演示:

 在输入的时候,输错的话可以使用 ctrl backspace 删除后重新输入;

源代码:

comm.h:将所有用到的头文件放入此文件中

 server.c:在此文件中完成了命名管道文件的创建,并从管道文件中取数据的功能;

 client.c:在此文件中完成了将从键盘输入的数据传入管道文件中;

makefile:书写依赖关系与依赖方法 ;

2. 使用命名管道进行简单进程间的控制;

效果演示:

  只需要修改 server.c 的内容即可:

#include "comm.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
  //创建命名管道
  umask(0);
  if(mkfifo(MY_FIFO,0666)<0)    
  {    
    perror("mkfifo");    
    return 1;    
  }    
  //打开命名管道    
  int fd = open(MY_FIFO,O_RDONLY);    
  if(fd<0)    
  {    
    perror("open fail");    
    return 1;    
  }    
  //业务逻辑    
  while(1)    
  {    
    char buffer[64]={0};    
    ssize_t s = read(fd,buffer,sizeof(buffer));    
    if(s>0)    
    {    
      buffer[s-1]=0;    
      if(strcmp(buffer,"show")==0)    
      {    
        if(fork()==0)    
        {    
          execl("/usr/bin/ls","ls","-l",NULL);    
          return 1;    
        }    
        waitpid(-1,NULL,0);    
      }    
      else if(strcmp(buffer,"sl")==0)    
      {    
        if(fork()==0)    
        {                                                                                     
          execl("/usr/bin/sl","sl",NULL);    
          return 1;    
        }     
        waitpid(-1,NULL,0);    
      }                                        
      else 
      {
        printf("client say # %s\n",buffer);
      }
    }
    else if(s==0)
    {
      printf("client quit...\n");
      break;
    }
    else 
    {
      perror("read");
      break;
    }
  }
  //关闭管道文件
  close(fd);
  return 0;
}

其实质上先从管道文件中读取数据,然后将读取到的数据,与自己设置的条件进行比对,符合条件的,创建子进程——>程序替换,使子进程去完成另一个程序,从而达到此效果!🔮

在这里要提的一点是:

利用管道文件通信,是将数据放入内核缓冲区中的,不会刷新到管道文件中;

如下可以验证:

 我们将server先睡眠50秒,也就是说在50秒之内server不会读取管道文件中的数据;

 从client端输入数据到管道文件中,利用shell脚本对管道文件进行观察;

发现管道文件大小一直是0;

坚持打卡!😀

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

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

相关文章

急急急!Kafka Topic 资源权限紧张怎么办?

我们都知道 Kafka 的 topic 资源比较“贵”&#xff0c;所以一般会给项目 topic 权限限制&#xff0c;按需申请。Milvus 会在建新表时自动申请 kafka topic 资源&#xff0c;这时候自动申请不到怎么办&#xff1f;手动配置 topic 要符合什么规范才能被 Milvus 使用&#xff1f;…

Vue 3 第十六章:组件五(内置组件-teleport)

文章目录 1. Teleport组件的基本用法2. Teleport组件的高级用法2.1. 禁用 Teleport2.2. 多个Teleport组件共享目标元素 1. Teleport组件的基本用法 <teleport>组件用于将组件的内容插入到指定的DOM元素中&#xff0c;而不是插入到组件自身的位置。例如&#xff0c;当我们…

improperIntegral反常积分

(https://img-blog.csdnimg.cn/e5973004aba8484a82839773ff58a390.png)

【刷题记录】leetcode215 数组中的第K个最大元素

题目链接&#xff1a;215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 题干&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k …

cleanmymac到底好不好用?有必要买吗

CleanMyMac是一款Mac电脑清理和保护工具,其最新版本为CleanMyMac X4.13。本版本在性能和功能上有较大提高,在如今的电脑使用过程中&#xff0c;保持电脑干净整洁是一项重要的任务。而随着Mac电脑越来越受欢迎&#xff0c;Mac电脑清理软件也愈发流行。在众多的Mac电脑清理软件中…

2023年PMP证书的含金量有多高?对于企业来说有多大的价值?

这里我就说一下关于PMP证书的含金量问题 1、方便就业 众所周知年这几年就业形势严峻。但是在这种大环境下&#xff0c;PMP证书持有者就业形势依然乐观。在求职市场&#xff0c;职位需求量大且薪资可观。 这种局面的形成主要是因为企项目管理规模化发展是一种发展趋势。随着公…

【error】linux运行java的jar包报错,java.lang.UnsatisfiedLinkError

目录 linux运行串口相关的java.jar报错如下&#xff1a; java.lang.UnsatisfiedLinkError是Java中的一个错误类型&#xff0c;通常发生在调用本地&#xff08;native&#xff09;方法或使用JNI&#xff08;Java Native Interface&#xff09;时。 在Java中&#xff0c;本地…

Vue(内置指令、自定义指令)

一、内置指令 1. v-text 和插值语法的效果类似 <h2>{{name}}</h2><h2 v-text"name">此处v-text绑定的数据替换所有标签内内容</h2> //vuedata: {name: "xlf",}, 注意&#xff1a;不能识别标签数据 <h2 v-text"name2"…

立体堆叠柱图的实现

立体堆叠柱图实现的实现 实现效果示例&#xff1a; 1、技术原理 1.1、技术分析 平面上的立体柱图可以看作是由4个平行四边形拼接而成的图形&#xff0c;分别是&#xff1a; 1、顶部菱形2和3、左右矩形&#xff0c;他们两个色值相同但亮度不同&#xff0c;从而产生立体阴影…

国内也能畅玩gptchat,游玩攻略分享

看到很多人都不知道怎么玩gptchat&#xff0c;小编就不能忍了&#xff0c;其实要玩chatgpt是非常的简单的&#xff0c;完全是能免费体验chatgpt的强大的。下面我们一起来了解一下国内也能畅玩gptchat&#xff0c;游玩攻略分享。 一.Chatgpt国内为啥能玩 其实现在很多的程序都接…

人人都能升薪?深扒Android开发中的通天神器Framework

近年来&#xff0c;客户端领域的竞争日益激烈&#xff0c;很多安卓开发者抱怨内卷现象普遍存在。在这种背景下&#xff0c;开发者们面对的压力越来越大&#xff0c;很难掌握足够的技能去顺利发展。解决内卷&#xff0c;突破迷茫&#xff0c;是许多开发者面临的挑战。小米的高管…

win 10电脑无法修改etc下文件的解决方法

不说废话&#xff0c;直接用etc下面的networks文件来举例子&#xff0c;当我想要修改该文件并重新保存的时候提示与管理员联系获得权限&#xff0c;解决方式如下&#xff1a; 首先&#xff0c;选中需要修改的networs文件&#xff0c;右键“属性”&#xff1b; 找到“安全”&…

3.软考——操作系统章节

操作系统章节 1.进程管理 银行家算法见博客 2.存储管理 1.页式存储 状态位为0的表示不在内存中&#xff0c;状态位为1的表示在内存中 如果不在内存中的要进入内存&#xff0c;需要去干掉再内存中的 原则&#xff1a; 1.一定是状态位位1的&#xff1b;然后再看访问位&#…

玩转smardaten | 探秘画布能力,搞定无代码复杂页面设计

下面这些是你印象中无代码能配置出的页面吗&#xff1f;“条条框框”、“一板一眼”的基础表单、列表、详情是无代码页面开发的全部吗&#xff1f; 当然不是&#xff01;花样排版与自由布局的展示页、交互丰富与多模块嵌套的首页&#xff0c;也是企业级软件页面中不可或缺的一部…

mybatis generator自定义model的代码注释

mbg相信大家都比较熟悉&#xff0c;可以自动化的生成数据库表对应的model&#xff0c;mapper。但是最近在使用mbg的时候遇到了这样的问题&#xff1a; 1、生成的model虽然可以根据数据库字段的comment生成注释&#xff0c;但这些注释仅对后端开发人员可见&#xff0c;如果想让前…

HNU-计算机系统-实验3-BombLab

写在前面 首先要感谢A橙_大佬&#xff0c;在之前的实验以及学习中&#xff0c;许多地方参考与学习了大佬的思路。 本次实验也是听取了A橙_大佬的建议&#xff0c;先自己做一遍&#xff0c;再看答案&#xff0c;有了更进一步的深入理解。 最后在验收的时候&#xff0c;发现验…

“豪”秀上演——莱佛士学生作品精彩亮相施华蔻发布会

4月12日&#xff0c;一场美轮美奂的视觉盛宴——施华蔻专业2023春夏新季风发布会&#xff0c;在广州珠江琶醍啤酒文化创意艺术区盛大举行。 ▲施华蔻专业2023春夏新季风发布会现场 当天发布会以《重组新生》为主题&#xff0c;施华蔻将潮流趋势、前沿发艺与先锋科技相结合&…

c++中set_difference这个函数的意义和用法

今天正好碰到了这个函数&#xff0c;虽然大概可以猜出这个函数的作用&#xff0c;但是仍然期待一个通俗易懂的解释&#xff0c;网上搜索了一下&#xff0c;搜到百度百科&#xff0c;感觉没有抓住重点&#xff0c;虽然示例也勉强可以理解&#xff0c;但是总感觉讲究不够直观。 …

【PLC】贝加莱PLC理论及实操年度培训

最近在进行PLC培训&#xff0c;主要是贝加莱PLC产品的学习&#xff0c;学习了上下位机的一些基本操作&#xff0c;能够进行一些简单的实践&#xff0c;最后顺利通过年度考核。 0 引言 PLC&#xff1a;可编程逻辑控制器&#xff0c;由CPU、存储器、输入输出接口、电影以及外部设…

冬奥会传统文化管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87720226 更多系统资源库…