Skip to content

进程间通信

进程是操作系统提供给上层的虚拟容器,为程序运行提供隔离和保护。容器之间需要交互,交互方式由操作系统提供相应的系统调用实现。

基于内存的通信

  1. 信号

    c
    sigprocmask()
    • 信号是一种软件软中断机制
    • 为进程提供响应外界发送单向数据的机制
    • 进程可以实现对特定信号的响应逻辑
    • 类似于事件的概念
    • 信号的回调函数是异步的,最好是可重入的

    信号处理流程:

    • 信号发送:操作系统生成信号并发送给目标进程
    • 信号接收和处理:进程接收信号,执行信号处理程序
    • 默认行为:
      • 终止进程(如SIGKILL、SIGTERM)
      • 暂停进程(如SIGSTOP)
      • 忽略信号(如SIGCHLD)
      • 继续执行(如SIGCONT)
  2. 管道

    c
    pipe()
    mkfifo()
    • 单向管道(匿名管道):主要用于父子进程间通信,数据流是单向的
    • 双向管道(命名管道):支持无父子关系的进程间通信
  3. 消息队列

    c
    msgget()
    msgsnd()
    msgrcv()
    • 在内核中维护的队列,用于存储进程间交换的消息
    • 支持消息的异步传输
    • 消息在队列中按顺序排列
    • 支持优先级
    • 提供良好的可靠性和同步机制
  4. 信号量(Semaphore)

    • 用于控制多个进程对共享资源访问的同步机制
    • 用于进程间的互斥和同步
    • 类型:
      • 二值信号量(互斥锁):值只有0和1
      • 计数信号量:值可以是非负整数,表示资源剩余数量
  5. 共享内存

    c
    shm_open()
    • 多个进程可以同时访问共享内存
    • 通常需要使用互斥量或信号量进行同步
    • 适合大量、快速的进程间数据共享

基于文件的通信

  1. 套接字(Socket)

    • 满足跨主机的通信
    • 特别适合通过网络或专用线路通信
  2. eventfd

    • 用于进程或线程间通信
    • 支持用户态和内核态之间通信
  3. 磁盘文件