linux 命名管道 mkfifo

news2024/11/27 16:51:02

  

  • 专栏内容:linux下并发编程
  • 个人主页:我的主页
  • 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

目录

前言

概述

原理介绍

接口说明

代码演示

结尾


前言

本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。


概述

在不同进程和程序间如何传递少量数据,且能阻塞形式使用,这就用到了管道。管道分为两种,无名管道和命名管道,因为子进程可以复制父进程的进程上下文,所以无名管道用在父子进程间,而命名管道在不同进程间通过路径名进行共享,更加通用。

原理介绍

命名管道是一种在进程间进行通信的机制,它可以用于在两个进程间进行数据传输。具体来说,命名管道是一种特殊类型的文件,它可以在不同的进程中被打开和读写,从而实现了进程间的通信。一般情况下,在Linux系统中,命名管道的创建和使用是通过C语言的相关API实现的。

建立管道文件后,可以在路径下看到,它的文件类型为 p ,说明它是管道文件。管道文件不同于一般文件的是,写时会阻塞,至到数据被读出,而在读时无数据的话会阻塞等待,直到有数据被写入。

通过系统命令也可以创建命名管道,如下:

[senllang@localhost pipetest]$ mkfifo /tmp/myfilo

[senllang@localhost pipetest]$ ll /tmp/

total 0

prw-r--r--. 1 senllang develops  0 Apr  8 15:52 myfilo

可以看到管道文件的类型为 p,我们打开两个终端进行读写测试。

终端一写入

[senllang@localhost pipetest]$ echo "hello" > /tmp/myfifo 

因为没有读,此时会卡住

终端二读取

[senllang@localhost ~]$ cat /tmp/myfifo

hello

可以看到读出了hello,此时终端一也会解除阻塞。同样先读取也会阻塞,直到写入数据为至。

接口说明

(1)管道文件创建

#include <sys/types.h>

#include <sys/stat.h>



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

通过传递路径pathname和mode权限来创建管道文件。

#include <fcntl.h>           /* Definition of AT_* constants */

#include <sys/stat.h>



int mkfifoat(int dirfd, const char *pathname, mode_t mode);

这是另一个版本,当pathname是相对路径时,创建路径是在dirfd指定的目录下。当dirfd为 AT_FDCWD时,用mkfifo效果一样。

(2)管道文件打开/读写/关闭

常用的文件操作 open/read/write/close

(3)删除管道文件

unlink(fd)

在用完管道时,需要删除管道文件,和删除文件类似。

代码演示

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

int main()
{
    int fd;
    char *myfifo = "/tmp/myfifo";
    char input[256];
    char output[256];

    /* create named pipe */
    mkfifo(myfifo, 0666);

    /* open named pipe for reading */
    fd = open(myfifo, O_RDWR);

    while(1) 
    {
      /* read input from named pipe */
      read(fd, input, 256);

      /* convert input to uppercase */
      int i;
      for (i = 0; input[i]; i++) 
      {
        output[i] = toupper(input[i]);
      }

      /* write output to named pipe */
      int len = i;
      write(fd, output, len);
    }

    /* close named pipe */
    close(fd);
    unlink(myfifo);

    return 0;
}

编译后运行,管道里的字符串被程序转为大写后又写入管道。


[senllang@localhost pipetest]$ gcc mkfifo_ex01.c -o mkfifo_ex01
[senllang@localhost pipetest]$ ./mkfifo_ex01

在另一个终端写入字符串,

[senllang@localhost ~]$ echo "hello" >/tmp/myfifo
[senllang@localhost ~]$ cat /tmp/myfifo
HELLO
 


结尾

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。另外有什么想要了解的内容,也可以给我发邮件,互相谈讨,定知无不言。

注:未经同意,不得转载!

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

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

相关文章

HBU 2023 Simple problem set

目录 7-1 递推公式 7-2 存钱罐 7-3 买东西 7-4 双重子串 7-5 放小球 7-6 最短路径 7-7 统计子序列的个数 7-8 摆放灯笼 7-9 选零食 7-10 1还是2 7-11 最少的门禁数量 7-12 青春猪头之开学了要好好学习 7-13 青春猪头之毕设真头大 7-14 青春猪头之我没学过C语言 7-15 发射小球 7…

FreeRTOS 列表和列表项

文章目录一、什么是列表和列表项&#xff1f;二、列表和列表项初始化三、列表项插入四、列表项末尾插入五、列表项的删除六、列表的遍历七、列表项的插入和删除实验一、什么是列表和列表项&#xff1f; 1. 列表 列表是 FreeRTOS 中的一个数据结构&#xff0c;概念上和链表有点…

【九】springboot启动源码 - refreshContext结束后

afterRefresh 钩子函数,默认实现为空 listeners.started 执行实现SpringApplicationRunListener的started回调 通用处理 this.listeners在之前已经通过SPI加载 获取SpringApplicationRunListener的实现类 EventPublishingRunListener 推送ApplicationStartedEvent事件…

红队内网靶场

文章目录开篇介绍靶场介绍靶场下载以及配置Tomcat Get Shell突破DMZ防火墙拿下域内成员机器将内网机器上线到CS使用Adfind侦察子域信息控制子域DCRadmin登录子域进行权限维持(白银票据/ACL)子域bloodhound获取父域信息分析子域Krbtgt密钥创建跨域金票Dcsync父域PTH父域DC准备打…

Activity启动模式

Activity的启动模式 首先activity启动之后是放在任务栈中的&#xff0c;task stack&#xff0c;既然是栈&#xff0c;遵循先进后出原则。有玩家比喻oncreate是入栈&#xff0c;onDestroy是出栈。 同一个APP中&#xff0c;不同的activity可以设置为不同的启动模式。在manifest…

【深一点学习】我用CPU也能跟着沐神实现单发多框检测(SSD),从底层了解目标检测任务的实现过程,需要什么样的方法调用。《动手学深度学习》Yes,沐神,Yes

目标检测近年来已经取得了很重要的进展&#xff0c;主流的算法主要分为两个类型[1611.06612] RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation (arxiv.org)&#xff1a;&#xff08;1&#xff09;two-stage方法&#xff0c;如R-CNN系算法…

centos7.2-rh7.2安装docker的问题

目录1. 环境2. 问题排查2.1 failed to start daemon: error initializing graphdriver: overlay2: the backing xfs filesystem2.2 centos7.2内核bridge.ko问题2.3 kernel:unregister_netdevice: waiting for ... to become free. Usage count 12.4 离线安装依赖问题1. 环境 …

AC7811—FOC无感控制代码调试与测试

目录 滑膜观测器调试 开环调试 闭环调试 IF VF DIRECT IF VF DIRECT 磁链观测器 一次/两次预定位 脉冲注入 高频注入 直线or五段曲线 滑膜观测器调试 开环调试 PWM0 两通道接示波器后&#xff0c;屏幕上打印的是开环给定同步转速积分电角度和滑模观测器估计转子电…

【C++】从string开始了解STL

文章目录1.初识STL1.什么是STL2.STL的版本3.STL的六大组件2.string1.string类模板2.string类的构造函数3.string内部数据访问4.string的遍历5.string类的迭代器6.string的Capacity相关接口7.string的修改相关接口8.其他接口1.初识STL 1.什么是STL STL(standard template liba…

Kotlin在Android开发中的应用与实践

Kotlin在Android开发中的应用与实践 通过本篇文章你将了解到下面内容&#xff1a; 介绍Kotlin语言&#xff1a;简述Kotlin语言的背景、特点和优势&#xff0c;为什么Kotlin在Android开发中变得越来越流行。 Kotlin与Java的对比&#xff1a;对比Kotlin和Java在语法、编程范式、…

规模化敏捷框架:Scrum@Scale

Scrum 敏捷方法有助于团队成员之间更有效地合作&#xff0c;实现共同的业务目标。但是当一个组织想要扩展 Scrum 方法到更多的团队时&#xff0c;应该如何实施&#xff1f;Scrum 仅为单团队开发、交付和运维产品提供了一个框架&#xff0c;而 ScrumScale&#xff08;SS&#xf…

多模态 AI 开发者召集令|4月22日@深圳,等你参加!

四月春暖花开&#xff0c;Jina AI 联合好朋友 OpenMMLab 一起&#xff0c;共同举办第八期「中文社区面对面」活动&#xff0c;将于 4 月 22 日&#xff08;周六&#xff09;下午在 Alpha Bay 深圳智汇港湾孵化器举行。本活动也得到了亚马逊云科技 User Group深圳、Xtreme1 的大…

C++ std::cin

C std::cin相关概念使用1. 一个常见的使用场景&#xff1a;2. 用于静态对象的构造和析构函数中&#xff0c;访问标准输入/输出流是安全的。3. 作为 *while* 语句的条件4. 配合 *get*、*getline* 使用相关概念 istream 一个class&#xff0c;提供输入操作。cin 一个 istream 对…

javaweb游戏代练网站设计与实现

目 录 第1章 绪论 5 1.1 选题的依据及意义 5 1.2 国内外现状研究 6 1.3 研究目的 6 第2章 设计技术与开发环境 7 2.1 相关技术介绍 7 2.1.1 JSP简介 7 2.1.2 B/S模式分析 8 2.1.3 mysql简介 9 2.2 开发环境介绍 9 2.2.1 Myeclipse简介 9 2…

魔镜魔镜告诉我,如何挑选靠谱的硬件方案!

随着传统健身房半胁迫顾客进行数万元的预售、办卡后&#xff0c;分分钟遁地跑路的新闻已经在大家心中留下了深深的烙印&#xff0c;再加上良莠不齐的教练、器材质量、永远无法抢到的健身课、以及办卡之后就被“打入冷宫”……可真是苦了每一个无处安放的运动灵魂啊&#xff01;…

XCODE14生成的APP制作成IPA

1.用XCODE14生成Archives存档包 2.在Finder中显示 3.显示包内容 4.双击进入Products 5.双击进入Applications 6.复制生成的.App文件到Playload文件夹 压缩Playload文件夹成zip 重命名zip为ipa 在弹出 的 提示中 选择 Use .ipa 重命名IPA文件为自己的命名

【vscode】SSH连接远程服务器Host/容器

目录 1. 连接远程服务器 1.1 确保远程服务器Host上ssh打开 1.2 本地主机 1.2.1 安装ssh-client 1.2.2 安装vscode插件 1.2.3 通过密钥完成身份认证 1.2.4 SSH连接配置 2. Python代码跳转 3. C代码跳转 4. Git 历史记录 5. 连接远程服务器上的Docker容器&#xff08;易…

radmin远程控制软件怎么样,有没有替代品

Radmin 是流行的、屡获殊荣的安全远程控制软件&#xff0c;它使您能够在远程计算机上实时工作&#xff0c;就像使用它自己的键盘和鼠标一样。 您可以从多个地方远程访问同一台计算机&#xff0c;是网络和管理类别中流行的远程桌面工具。 Radmin 是外国软件&#xff0c;在国内使…

Unity协程和线程的区别深入理解(附实验展示)

Unity协程和线程的区别附实验展示写在前面协程、进程、线程的概念进程与线程的区别协程与线程的区别实验1&#xff1a;协程中执行普通函数实验2&#xff1a;协程中开启另一个协程实验3&#xff1a;协程中开启WWW请求实验4&#xff1a;一个脚本中多个协程访问临界资源实验5&…

车载以太网基础篇之Eth Driver

车载以太网基础篇之Ethernet Driver前言 首先&#xff0c;请问大家几个小小问题&#xff0c;你清楚&#xff1a; 你知道Eth Driver模块的主要作用是什么吗&#xff1f;EthDriver与以太网控制器&#xff0c;以太网收发器&#xff0c;都有哪些关系呢&#xff1f;Eth Driver的常…