有名管道通讯编程

创建2个进程,在A进程中创建一个有名管道,并向其写入数据,通过B进程从有名管道中读出数据。

有名管道又称命名管道,可用于无亲缘关系的进程之间通信,在某些特点上类似于文件。

用法:通过mkfifo创建有名管道,之后就可以想操作普通文件通过open()、close()、write()、以及read()对它进行相应操作。

1、创建一个有名管道--mkfifo

头文件:#include<sys/types.h>,#include<sys/stat.h>

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

参数说明:pathname:创建有名管道对应的实名文件路径,mkfifo()会依参数建立特殊的FIFO文件,该文件必须不存在,mode:文件的权限。

返回值:成功返回0,失败返回-1,错误原因存于errno中。

2、删除有名管道(实质是一个文件)---unlink

头文件:#include<unistd.h>

原型:int unlink(const char *pathname);

参数说明:pathname:有名管道文件路径名

返回值:成功返回0,失败返回-1,错误原因存于errno中。

fifo_write.c

 

fifo_read.c

total.h

 

先执行读

后执行写

在这里为什么先执行读,再执行写才能把写入的数据读出来??当先写入数据时,再执行读 是没法读出数据的?为什么?

注意:

errno是记录系统的最后一次错误代码,代码是一个int型的值,在errno.h中定义。

对于参数O_NONBLOCK是非阻塞模式,以open操作为例,就是open以及接下来在这个文件描述符上的操作,都不会让调用进程等待数据到来,而是直接返回EAGAIN。比如你操作一个video camera设备,使用非阻塞模式打开/dev/video,读取数据时,v412 buffer队列有可用数据返回数据,没有可用数据,则立即返回EAGAIN。使用阻塞模式打开/dev/video,当没有数据可用时,则当前进程休眠在这个buffer queue等待队列上,直到新数据到达,唤醒等待队列上的进程才会返回。

总结:有名管道创建成功后,一个进程以只读方式打开,另一进程以只写方式打开。

posted on   gary_123  阅读(306)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示