【Linux学习笔记36】进程间的通信(一)(匿名管道与有名管道)

Linux下进程间通信概述

传统的进程间通信方式
  • 无名(匿名)管道(pipe) 最简单,只能用于一对一亲缘进程的少量数据传输
  • 有名管道(fifo)
  • 信号(signal) 异步方式
System V IPC对象
  • 共享内存(share memory) 适合于大数据量传输,不经过内核中转
  • 消息队列(message queue)
  • 信号量(semaphore)
  • POSIX信号量(无名、有名)
BSD
  • 套接字socket

无名(匿名)管道

工作原理:

在这里插入图片描述

  • 父进程在内核中建立管道PIPE
  • 管道中读、写是分开的
  • 子进程把父进程全部信息继承了,因此父子进程都可以通过管道进行读写操作,达到通信作用
  • 不保证写入原子性:若有多个进程进行写入操作,则会出现覆盖等错误,因此匿名管道只能一对一使用
代码实现

PIPE函数

head详细
功能创建无名管道:PIPE
头文件#include<unistd.h>
原型int pipe(int pipefd[2]);
参数pipefd:一个至少具有两个int 型数据的数组,用来存放PIPE的读写端描述符
返回值成功:0,失败:-1

代码:
在这里插入图片描述
运行结果:
在这里插入图片描述

匿名管道总结

匿名管道间的读写操作各种情况:
在这里插入图片描述


有名管道

有名管道的特点:
  • 有名管道拥有自身名字,因此可以实现任何两个拥有权限的进程进行通信。
  • 有名管道对写操作具有原子性
代码实现

mkfifo()函数

head详细
功能创建有名管道FIFO
头文件#include<sys/types.h>、#inlcude<sys/stat.h>
原型int mkfifo(const cahr *pathname,mode_t mode);
参数pathname:FIFO的文件名
参数mode:文件权限
返回值成功:0、失败:-1

执行代码:
在这里插入图片描述
在这里插入图片描述

值得注意的是:有名管道不能在Linux与Windows系统的共享文件夹中创建,因此如在Windows上编写代码的朋友要将代码移到Linux的目录中才可以成功创建有名管道

运行结果:
在这里插入图片描述


管道的实弹作用

有名管道解决日志文件的写入问题

程序会有写日志的习惯,而Linux中的日志文件都存放在在/var/log中。也会有出现这一情况:多个进程同时往同一日志中写入数据,那会会导致日志文件的数据嵌套,这个时候利用有名管道的方法能够有效解决问题:
在这里插入图片描述

  • 利用有名管道的原子性保证各个进程的数据不被嵌套、丢失、覆盖
  • log.d日志守护进程会将管道中的数据写入日志文件中

但是,进程并不需要像上面例子那样去查找这个有名管道或者打开利用它,实际上进程只需要调用函数openlog(),syslog()两个函数即可完成写入日志的操作,而建立有名管道去接受数据,全是由log.d这个日志守护进程完成。

客户端与服务端的管道

写入日志问题其实也可以看成一个客户端与服务端的通信问题:服务端创建管道,客户端往管道写入数据。下面是代码实现:

服务端
在这里插入图片描述
客户端
在这里插入图片描述
代码运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值