环境编程代码实例:进程间通信(IPC)

前言

环境编程代码实例:进程间通信(IPC)。


代码仓库


内容

低级:3种

  • 全局变量/glov:类似管道、命名管道、消息队列、共享内存:头文件/库文件全局变量,源文件全局变量
  • 文件/file:类似管道、命名管道、消息队列、共享内存
  • PV操作/pv:类似信号量

第三方:2种

  • 数据库/db:类似管道、命名管道、消息队列、共享内存
  • 缓存/cache:类似管道、命名管道、消息队列、共享内存

一般:7种

  • 管道/无名管道/pipe
  • 命名管道/有名管道/FIFO
  • 信号/signal
  • 信号量/semaphore:XSI信号量,POSIX信号量
  • 消息队列/mq
  • 共享内存/shm
  • 套接字/socket

高级:1种

  • 内存映射/mmap:类似共享内存

全局变量

头文件全局变量

缺点:

  • 只读,不可写
  • 同步互斥问题:无法解决。需要引入其他进程间通信机制才能解决
  • 扩展问题:无法解决。需要引入其他进程间通信机制才能解决

相关语句:

  • extern
  • #include

源文件全局变量

缺点:

  • 只读,不可写
  • 只能用于具有公共祖先的进程间
  • 同步互斥问题:无法解决。需要引入其他进程间通信机制才能解决
  • 扩展问题:无法解决。需要引入其他进程间通信机制才能解决

文件

缺点:

  • 性能问题:访问文件效率低
  • 同步互斥问题:无法解决。需要引入其他进程间通信机制才能解决
  • 扩展问题:无法解决。需要引入其他进程间通信机制才能解决

相关函数:

  • open()
  • fopen()

PV操作

缺点:

  • 同步互斥问题:无法解决。需要引入其他进程间通信机制才能解决
  • 扩展问题:无法解决。需要引入其他进程间通信机制才能解决

数据库

优点:

  • 相对于文件,由相关机制优化同步互斥、性能和扩展问题。

相关数据库:

  • MySQL
  • SQL Server

缓存

优点:

  • 相对于文件,由相关机制优化同步互斥、性能和扩展问题。

相关缓存:

  • Memcached
  • Redis

管道

缺点:

  • 半双工
  • 只能用于具有公共祖先的进程间

相关函数:

  • pipe():创建管道
  • popen():打开管道
  • pclose():关闭管道

命名管道

相关函数:

  • mkfifo():创建命名管道
  • mkfifoat():创建命名管道

信号

相关函数:

  • signal()
  • kill()

信号量

XSI信号量

缺点:

  • 在系统范围内起作用,没有引用计数。不能隐式删除,需要显式删除
  • 在文件系统中没有名字。不能使用文件相关函数操作,需要使用特定的系统调用或命令
  • 不使用文件描述符。不能使用多路复用函数操作,一般一次只使用一个而不是多个(消息队列)

相关函数:

  • semget():获取信号量
  • semctl():控制信号量
  • semop():操作信号量

POSIX信号量

相关函数:

  • sem_open():打开有名信号量
  • sem_close():关闭信号量
  • sem_unlink():销毁有名信号量
  • sem_trywait():尝试等待信号量
  • sem_wait():等待信号量
  • sem_timewait():定时等待信号量
  • sem_post():提交信号量
  • sem_init():初始化无名信号量
  • sem_destroy():销毁无名信号量
  • sem_getvalue():获取信号量值

消息队列/mq

缺点:

  • 在系统范围内起作用,没有引用计数。不能隐式删除,需要显式删除
  • 在文件系统中没有名字。不能使用文件相关函数操作,需要使用特定的系统调用或命令
  • 不使用文件描述符。不能使用多路复用函数操作,一般一次只使用一个而不是多个(消息队列)

相关函数:

  • ftok():创建键
  • msgget():获取消息队列
  • msgctl():控制消息队列
  • msgsnd():发送消息到消息队列
  • msgrcv():接收消息从消息队列

共享内存/shm

缺点:

  • 在系统范围内起作用,没有引用计数。不能隐式删除,需要显式删除
  • 在文件系统中没有名字。不能使用文件相关函数操作,需要使用特定的系统调用或命令
  • 不使用文件描述符。不能使用多路复用函数操作,一般一次只使用一个而不是多个(消息队列)

相关函数:

  • shmget():获取共享内存
  • shmctl():控制共享内存
  • shmat():连接共享内存
  • shmdt():分离共享内存

套接字/sock

优点:

  • 可用于不同主机进程间的通信

相关函数:

  • socket()
  • bind()

内存映射

相关函数:

  • mmap()
  • munmap()

代码

说明

  • 由于代码篇幅较多,在博客中直接粘贴并呈现会显得冗长,因此未在博客中放置代码。请前往"代码仓库"查看或获取相关代码
  • 对大部分总结的进程间通信机制提供简单实现
  • 有详细步骤解析
  • 只简单演示基础的操作,未考虑深层次的问题
  • 对相关函数获取返回值进行错误处理,不相关函数不进行错误处理

目录结构

  • 头文件全局变量:glov_h
  • 源文件全局变量:glov_s
  • 文件,PV操作:file_pv
  • 管道:pipe
  • 命名管道:fifo
  • 信号:sig
  • XSI信号量:sem_XSI
  • POSIX信号量:sem_POSIX
  • 消息队列:mq
  • 共享内存:shm
  • 套接字:socket(使用代码仓库中,“传输控制协议(TCP)简单版:TCP_simple”)
  • 内存映射:mmap

持续更新

  • 当前内容总结于博主和《UNIX环境高级编程(第3版)》的一部分
  • 在《UNIX网络编程(第3版)卷2:进程间通信》中,还有其他的进程间通信机制,在后面有时间阅读后,持续更新代码仓库和博客

总结

环境编程代码实例:进程间通信(IPC)。


参考资料

  • 《UNIX环境高级编程(第3版)》作者:W.Richard Stevens,Stephen A.Rago
  • 《UNIX网络编程(第3版)》作者:W.Richard Stevens,Bill Fenner,Andrew M.Rudoff

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值