Linux进程间通信——命名管道

Linux下进程间通信——命名管道 文章目录管道命名管道的定义和特点命名管道(fifo)和管道(pipe)的区别示例图运行示例 管道 管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 1,数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建 立两个管道; ... 阅读详情

mkfifo

在这里插入图片描述
现在先通过这段命令来创建一个FIFO文件

mkfifo fifo

接着我们会发现目录下出现了这个文件

在这里插入图片描述
开始的"p"代表"fifo"是一个管道文件,接下来我们创建两个进程,一个向fifo写数据,另一个从fifo读数据
在这里插入图片描述

命名管道

进程间的通信根本就是要让不同的进程看到同一份资源,而匿名管道利用的是子进程继承父进程资源的特性,让他们看到同一份资源。那么在没有血缘关系的进程间这种方式就行不通了。那么在这样的情况下我们可以使用命名管道进行进程间通信

命名管道与匿名管道的区别

1.匿名管道由pipe函数创建并打开
2.命名管道由mkfifo函数创建,打开用open
3.FIFO与pipe之间唯一的区别在于它们创建和打开的方式不同,一旦这些工作完成之后,它们具有相同的语义

命名管道实现进程间通信示例

在同一个目录下我们分别创建server.c和client.c(同时编译两个文件的操作见"如何让Makefile编译多个文件")文件,分别代表服务端和客户端,我们希望客户端向fifo写入数据,客户端接收数据并做出反馈

client.c

int main()
  4 {
  5   int fd = open(MY_FIFO, O_WRONLY);
  6   if (fd < 0)
  7   {
  8     perror("open");
  9     return 1;
 10   }
 11   while (1)
 12   {
 13     char buffer[64] = { 0 };
 14     printf("input: ");
 15     fflush(stdout);
 16     ssize_t s = read(0, buffer, sizeof(buffer) - 1); // 0文件是标准输入
 17     if (s > 0)
 18     {
 19       buffer[s - 1] = 0;
 20     //  printf("%s\n", buffer);
 21       write(fd, buffer, strlen(buffer));
 22     }
 23 
 24   }
 25   return 0;
 26 }

server.c

2 int main()                                  
  3 {                                  
  4   umask(0);                                  
  5   if (mkfifo(MY_FIFO,0666 ) < 0)
  6   {                                  
  7     perror("mkfifo");                
  8     return 1;                                          
  9   }                                            
 10   int fd = open(MY_FIFO, O_RDONLY);  
 11   if (fd < 0)       
 12   {                                     
 13     perror("open");                            
 14     return 2;                        
 15   }                                                  
 16                                                
 17   while (1)                          
 18   {                               
 19     char buffer[64] = { 0 };                 
 20     ssize_t s = read(fd, buffer, sizeof(buffer) - 1);
 21     if (s > 0)                                                
 22     {
 23       buffer[s] = 0;                                      
 24       if (strcmp(buffer, "show") == 0)          
 25       {                                
 26         if (fork() == 0)                              
 27         {
 28          execl("/usr/bin/ls", "ls", "-l", NULL);
 29         }                                
 30         waitpid(-1, NULL, 0);                             
 31       }      
 else if (strcmp(buffer, "train") == 0)
 35       {
            // 当输入train时,运行sl,该进程下载方式为yum install sl命令
 36         execl("/usr/bin/sl", "sl", NULL);
 37       }
 38       else 
 39       {
 40          printf("client: %s\n", buffer); 
 41       }
 42     }
 43     else if (s == 0)
 44     {
 45       printf("client quit\n");
 46       break;
 47     }
 48     else 
 49     {
 50       perror("read");
 51       break;
 52     }
 53   }
 54 
 55   close(fd);
 56   return 0;
 57 }   

如何让Makefile编译多个文件

我们可以先写一个伪文件all,并指明all需要依靠client和server文件,之后在写client和server需要的操作,具体Makefile如下

.PHONY:all
all:client server
client:client.c
	gcc -o $@ $^
server:server.c
	gcc -o $@ $^
.PHONY:clean
clean:
	rm -f client server fifo
Linux C命名管道实现进程间通信 命名管道实现进程间通信 命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似。 创建命名管道 以下两个函数都可以用来创建命名管道(任选一个),函数原型如下: #include #include int mkfifo(const char *filename, mode 阅读详情

相关推荐

1014. 福尔摩斯的约会 (20)-PAT乙级真题

1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’

柳婼 の blog 2646

Linux系统编程——命名管道

进程间通信——命名管道

qq_48335434的博客 2690

保研专业课复习别瞎卷!抓住408和数学重点,用真题反推高效复习路径

本文针对计算机专业保研学生,提出以真题为导向的408专业课和数学高效复习策略。通过构建真题知识图谱、分析题型与难度矩阵,帮助考生精准把握数据结构、操作系统等核心科目的高频考点,如树与图算法、TCP/IP协议栈等,并制定科学的时间分配方案,实现短期内的快速突破。

weixin_27966471的博客 402

【Linux】命名管道

匿名管道与命名管道的区别 - 匿名管道由`pipe`函数创建并打开。 - 命名管道由`mkfifo`函数创建,打开用`open` - FIFO(命名管道)与 pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

宁清的博客 1767

保姆级教程:在Davinci Configurator里配置BswM的ECU状态机(附状态切换流程图)

本文提供了一份详细的AUTOSAR BswM模块配置指南,通过Davinci Configurator工具实现ECU状态机的构建与管理。内容涵盖从模式请求端口创建到状态切换规则定义的全流程,特别针对Ecu State Handling进行了深入解析,并附有状态切换流程图,帮助汽车电子工程师高效完成ECU状态管理配置。

weixin_28366475的博客 411

Canoe CAPL TCP通信避坑指南:从OnTcpConnect回调不触发到Socket句柄管理

本文详细解析了Canoe CAPL中TCP通信的常见问题与解决方案,包括OnTcpConnect回调不触发的三大原因、Socket句柄管理的内存泄漏风险、数据发送截断规则等。通过实战案例和代码示例,帮助开发者规避TCP通信中的典型陷阱,提升车载网络测试的稳定性和可靠性。

weixin_26976635的博客 358

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

命名管道通信属于IPC的其中一种方式,作为管道家族,命名管道的特点就是自带同步与互斥机制、数据单向流通,与匿名管道不同的是:命名管道有自己的名字,因此可以被没有血缘关系的进程看到,意味着命名管道可以实现毫不相干的两个独立进程间通信

北 海的博客 1万+

用74LS160和74LS194搭个复古流水灯:从Multisim仿真到面包板实战(附完整电路图)

本文详细介绍了如何使用74LS160和74LS194芯片搭建复古流水灯电路,从Multisim仿真到面包板实战的全过程。通过解析核心器件特性、提供完整材料清单、仿真验证电路逻辑,以及实际搭建中的布局规划和调试技巧,帮助电子爱好者掌握这一经典数字电路设计项目。

weixin_28736355的博客 388

【Linux】—— 命名管道详解

命名管道详解

m0_56069910的博客 2090

STA 静态时序分析 第三章——标准单元库中的高级功耗建模与优化策略

本文深入探讨了STA静态时序分析中标准单元库的高级功耗建模与优化策略。详细解析了动态功耗和漏电功耗的精细建模技术,包括基于波形敏感的CCS模型和温度敏感的漏电模型,并介绍了多工艺角功耗建模及低功耗设计优化策略,为纳米级芯片设计提供关键能效解决方案。

weixin_29290863的博客 224

Android16 RK3576 Bluetooth source和sink模式切换

摘要:本文介绍了在RK3576平台上实现蓝牙A2DP模式动态切换的修改方案。通过在device配置文件中添加A2DP Sink相关属性,修改Bluetooth模块代码实现:1)在Config.java中增加persist.bluetooth.rka2dpsink属性控制模式切换;2)修改A2dpSinkStreamHandler.java取消音频焦点限制;3)调整btif_a2dp_sink.cc默认授予音频焦点。最终通过设置persist.bluetooth.rka2dpsink属性为true/false

tzj1058756809的博客 861

进程间通信之命名管道

管道应用的一个限制就是(具有亲缘关系)的进程间通信,这种通信可以用来实现。如果我们想,可以使用FIFO文件来做这项工作,它经常被称为。1.什么是命名管道?命名管道(named pipe)也称为FIFO,它是一种文件类型,创建一个FIFO文件类似于创建一个普通文件。FIFO解决了只有具有亲缘关系的进程间才能通信的问题。并且命名管道是一种特殊类型的文件。2.匿名管道与命名管道的区别?

k5426244的博客 1172

电机控制基础,小白入门篇

电机,这个藏在风扇、电动车、机器人里的“动力心脏”,如何精准控制它的转速、方向甚至力量?这篇博客专为完全零基础的小白打造,用“说人话”的方式拆解电机控制的底层逻辑,帮你从“看不懂电路图”到“能调个简单电机”。 电机控制不是“大神专属”,只要掌握“电生磁、磁生力”的底层逻辑,加上动手实践,小白也能快速入门。这篇博客会陪你从“看电机转”到“让电机听话”,把复杂的控制原理变成能上手玩的“小实验”。准备好你的面包板和电机,我们一起开启“电控之旅”吧!

汽车电子软件领域知识分享 5613

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

匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用命名管道来做这项工作。在Linux系统中,命名管道(也称为FIFO)是一种特殊的文件类型,它允许进程间进行通信。与匿名管道不同,命名管道存在于文件系统中,并且可以被任何有适当权限的进程访问。命名管道提供了一种方法,使得不相关的进程能够通过预先定义好的路径来交换数据。匿名管道由pipe函数创建并打开。而命名管道由mkfifo函数创建,打开⽤open。FIFO(命名管道)与pipe。

Renswc的博客 3325

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Wzs040810的博客 2412

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Linux进程间通信——使用命名管道

在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。 一、什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系

ljianhui的专栏 8万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【Linux系统】进程间通信:命名管道

本文介绍了命名管道的概念及其在进程间通信中的应用。首先分析了匿名管道的局限性(仅限亲缘进程、单向通信等),进而引出命名管道的优势:通过文件系统路径实现任意进程间通信。文章详细说明了命名管道的创建方法(命令行和程序内创建)、操作规则(阻塞/非阻塞模式)以及与匿名管道的区别。重点阐述了命名管道的打开规则,包括不同模式下(O_RDONLY/O_WRONLY)结合O_NONBLOCK标志的行为差异。最后通过C++代码示例展示了如何封装命名管道类,实现无亲缘关系进程间的单向通信,包含管道创建、读写操作和资源回收的完整

2402_82670467的博客 1690

[Linux] 进程间通信——匿名管道&&命名管道

[Linux] 进程间通信——匿名管道&&命名管道

石墨博客 1414

Linux进程间通信:匿名管道 &命名管道

管道最早是UNIX中的一种进程通信方式。我们把一个进程到另一个进程的一个数据流称为管道!!管道文件时一个纯内存级文件,不需要想磁盘刷新。进程间通信的本质是不同进程看到同一份资源。该资源一般由操作系统提供!!(比如缓冲区)  进程间通信目的主要有: 数据传输:一个进程需要将它的数据发送给另一个进程。 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 进程控制:有些进程希望完全控制另一个进程的执行(如Debug

Zhenyu_Coder的博客 1640

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

命名管道是一种特殊的文件类型,它在文件系统中有一个名字,就像普通文件一样,但它的作用不是存储数据,而是用于进程间通信。与匿名管道不同,命名管道可以在不相关的进程之间进行通信,并且可以跨越不同的主机(在支持网络命名管道的系统中)。特点半双工或全双工:命名管道可以配置为半双工或全双工模式。在半双工模式下,数据可以在两个方向上传输,但不能同时进行;在全双工模式下,数据可以同时在两个方向上传输,这使得通信更加灵活,能满足不同应用场景的需求。

GGDxianv的博客 1457

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

为减少这种开销,可以采取预先创建一组子进程的策略(以避免在任务分配时进行即时创建),并在子进程空闲时让它们处于阻塞状态(以防止子进程完成任务后被立即终止,从而在下一次任务分配时无需重新创建进程)。所以,如果我们关闭一个文件描述符,仅仅只是关闭了父进程的一个,但子进程继承的写端都没有关闭;因为我们关闭是从上往下的,最后一个管道先释放,最后一个管道释放了,那么它曾经对应指向上一个写端也就自动关闭了,类似于递归,从上往下关,然后从下往上不断读到0的。的过程中我们是先把所有的管道关闭结束后,再进行等待;

2202_75331338的博客 1892

【Linux学习】进程间通信——匿名管道 | 命名管道

介绍了进程间通信的相关概念,详细讲解了匿名管道和命名管道的工作原理和代码实现。还有详细介绍了进程池小项目。

weixin_63726869的博客 2262

Linux下通过命名管道实现进程间通信

引入 上一篇文章介绍了 Linux 中通过pipe创建匿名管道,并实现父子进程间通信的功能;当时我就提到了 Linux 中的另一种管道通信方式——命名管道,下面就来详细介绍一下; 命名管道 什么是命名管道 命名管道(Named Pipe),也叫FIFO(First In First Out),是一种用于进程间通信(IPC)...

cnzzs的博客 1067

Linux进程间通信——匿名管道|命名管道

匿名管道 命名管道

m0_70289867的博客 1585

linux进程间通信——命名管道、 日志程序

linux进程间通信——命名管道的原理, 使用!!!!

strive_mianyang的博客 1429
上一篇: Linux进程间通信——匿名管道
下一篇: Linux进程间通信——共享内存
JayceSun449
博客等级 码龄5年 554粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JayceSun449

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值