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

文章目录

  • 前言
  • 代码仓库
  • 内容
    • 全局变量
      • 头文件全局变量
      • 源文件全局变量
    • 文件
    • PV操作
    • 数据库
    • 缓存
    • 管道
    • 命名管道
    • 信号
    • 信号量
      • XSI信号量
      • POSIX信号量
    • 消息队列/mq
    • 共享内存/shm
    • 套接字/sock
    • 内存映射
  • 代码
    • 说明
    • 目录结构
  • 持续更新
  • 总结
  • 参考资料
  • 作者的话

前言

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


代码仓库

  • 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

源文件全局变量

缺点:

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

文件

缺点:

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

相关函数:

  • 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),环境编程,C语言,后端,架构)