前言
环境编程代码实例:进程间通信(IPC)。文章来源地址https://www.toymoban.com/news/detail-446738.html
代码仓库
- yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)
- Environment-and-network-programming-examples: 环境和网络编程实例 (gitee.com)
内容
低级:3种
- 全局变量/glov:类似管道、命名管道、消息队列、共享内存:头文件/库文件全局变量,源文件全局变量
- 文件/file:类似管道、命名管道、消息队列、共享内存
- PV操作/pv:类似信号量
第三方:2种
- 数据库/db:类似管道、命名管道、消息队列、共享内存
- 缓存/cache:类似管道、命名管道、消息队列、共享内存
一般:7种
- 管道/无名管道/pipe
- 命名管道/有名管道/FIFO
- 信号/signal
- 信号量/semaphore:XSI信号量,POSIX信号量
- 消息队列/mq
- 共享内存/shm
- 套接字/socket
高级:1种
- 内存映射/mmap:类似共享内存
全局变量
头文件全局变量
缺点:
- 只读,不可写
- 同步互斥问题:无法解决。需要引入其他进程间通信机制才能解决
- 扩展问题:无法解决。需要引入其他进程间通信机制才能解决
相关语句:
- extern
- #include
- …
源文件全局变量
缺点:
- 只读,不可写
- 只能用于具有公共祖先的进程间
- 同步互斥问题:无法解决。需要引入其他进程间通信机制才能解决
- 扩展问题:无法解决。需要引入其他进程间通信机制才能解决
文件
缺点:
- 性能问题:访问文件效率低
- 同步互斥问题:无法解决。需要引入其他进程间通信机制才能解决
- 扩展问题:无法解决。需要引入其他进程间通信机制才能解决
相关函数:文章来源:https://www.toymoban.com/news/detail-446738.html
- 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
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获
到了这里,关于环境编程代码实例:进程间通信(IPC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!