当前位置:网站首页>进程间通信方式(2)有名管道
进程间通信方式(2)有名管道
2022-08-11 01:22:00 【畅畅ccc】
书接上文为大家介绍了无名管道的介绍,本文为大家继续介绍管道的第二种---有名管道,有名管道和无名管道的最大区别就是可以进行没有亲缘关系的父子进程间通信,那么本文将详细的为大家介绍有名管道的方式!
框架:创建有名管道 ==》打开有名管道 ==》读写管道==》关闭管道 ==》卸载有名管道
和无名管道类似,有名管道的框架大体相同,但不同于无名管道的区别是,有名管道的mkfifo的操作是创建一个管道,并非像无名管道一样pipe出来的返回值已经就是管道,mkfifo是创建一个管道,后续我们要进行open创建出来的管道的一端为输入或者输出的端口进行读写操作实现没有亲缘关系的不同进程间的数据通信和信息交换。
1.创建有名管道mkfifo
int mkfifo(const char *pathname, mode_t mode);
- 功能:在指定的pathname路径+名称下创建一个权限为mode的有名管道文件
- 参数:
- pathname要创建的有名管道路径
- mode--->8进制文件权限(通常为0777、0666、0664)
- 返回值:
- 成功 0
- 失败-1
2.打开有名管道open
- 以O_RDONLR打开时 ,管道在open处阻塞
- 以O_WRONLY打开时 ,管道在open处阻塞
- 当两端同时打开时,才解除阻塞。
3.读写管道read、write
通过文件IO的方式读写open打开的读写端,这里把读写端仍然看做文件描述符对其进行操作
4.关闭端口close
关闭open打开的文件描述符指向的读写的两端口
5.卸载有名管道remove
int remove(const char *pathname);
- 功能:将指定的pathname管道文件卸载,同时从文件系统中删除。
- 参数: ptahtname 要卸载的有名管道
- 返回值:
- 成功 0
- 失败 -1
代码示例:
//read的读取端,从另一个进程中收取发过来的信息 int main(int argc, const char *argv[]) { int ret = mkfifo("./fifo", 0777); if(ret < 0 && errno != EEXIST) { perror("fail to mkfifo"); return -1; } int fd_r = open("fifo", O_RDONLY); if(-1 == fd_r) { perror("fail to open"); return -1; } while(1) { char buff[1024] = {0}; read(fd_r, buff, sizeof(buff)); if(0 == strcmp(buff, "quit\n")) { break; } printf("w->r:%s", buff); } close(fd_r); remove("fifo"); return 0; }
//从终端获取一段信息,并且输入到fifo管道里面给另一端口写入 int main(int argc, const char *argv[]) { int fifo = mkfifo("./fifo", 0777); if(-1 == fifo && errno != EEXIST) { perror("fail to mkfifo"); return -1; } int fd_w = open("fifo", O_WRONLY); if(-1 == fd_w) { perror("fail to open"); return -1; } while(1) { char buff[1024] = {0}; fgets(buff, sizeof(buff), stdin); write(fd_w, buff, strlen(buff)+1); if(0 == strcmp(buff, "quit\n")) { break; } } close(fd_w); remove("fifo"); return 0; }
以上的代码实现的内容为两个没有父子亲缘关系的进程可以通过mkfifo建立管道,从而实现两个没有关系的进程之间的收发数据的通信方式。
通过以上代码可以让我们看出,mkfifo的简单使用,从而进一步加强我们知识理解,感兴趣的同学可以思考进行全双工的两个进程的通信方式,可以利用再之前学过的并发的知识来实现,具体的代码可以私聊我获得。
以上就是进程间通信的管道方式的两种方式,接下来为大家进行共享内存的通信方式的讲解,谢谢大家!
边栏推荐
猜你喜欢
什么是“门”电路(电子硬件)
[ASM] The relationship between the role of the bytecode operation ClassWriter COMPUTE_FRAMES and visitMaxs
构建资源的弹性伸缩
HCIP-R&S By Wakin自用笔记(3)OSPF之引入外部路由、Forwarding-Address、汇总、特殊区域
② 关系数据库标准语言SQL 数据定义(创建、修改基本表)、数据更新(增删改)
Kunpeng compilation and debugging and basic knowledge of native development tools
关于编程本质那些事
postgresql parameter meaning
二维数组实战项目--------《扫雷游戏》
apache+PHP+MySQL+word press, page error when installing word press?
随机推荐
络达开发---UI定义+自定义按钮事件
微信小程序强制更新版本
Still using Xshell?You are out, recommend a more modern terminal connection tool, easy to use!
异常:try catch finally throws throw
C#-委托的详细用法
MySQL advanced query
dump_stack()
Only lazy and hungry. You still don't understand the singleton pattern!
22、库存服务
③ 关系数据库标准语言SQL 数据查询(SELECT)
小程序onPageNotFound的坑
络达开发---自定义Timer的实现
[ASM] The relationship between the role of the bytecode operation ClassWriter COMPUTE_FRAMES and visitMaxs
Mysql数据库安装配置详细教程
How to convert url to obj or obj to url
【HFSS学习记录1】实例:宽带非对称多节定向耦合器设计
划分字母区间[贪心->空间换时间->数组hash优化]
Elastic scaling of construction resources
[GXYCTF2019]BabySQli
Dual machine thermal for comprehensive experiment (VRRP + OSPF + + NAT + DHCP + VTP PVSTP + single-arm routing)