进程间通信方法总结

一、为什么需要进程间通信?

  • 数据交换:进程间传递数据,例如一个客户端和服务器。

  • 资源共享:多个进程共享系统资源。

  • 事件通知:一个进程需要通知另一个进程某个事件已发生。

  • 进程控制:父子进程之间协调操作,如进程创建、终止等。


二、进程间通信的主要方式

1. 管道(Pipe)

1.1 无名管道(Unnamed Pipe)
  • 特点

    • 只能用于具有亲缘关系的进程(如父子进程)。

    • 单向通信。

  • API

    • pipe(int pipefd[2])

  • 优缺点

    • 简单、易于使用。

    • 只能在本地使用,通信方向单一。

1.2 命名管道(Named Pipe,FIFO)
  • 特点

    • 可以用于无亲缘关系的进程通信。

    • 仍然是单向的。

  • API

    • mkfifo(), open(), read(), write()

  • 优缺点

    • 可用于非亲缘进程。

    • 使用上较复杂,需要显式创建与管理。


2. 信号(Signal)

  • 特点

    • 用于通知进程事件发生(如终止、挂起等)。

    • 异步通信。

  • 常用信号

    • SIGINTSIGTERMSIGKILLSIGCHLD等。

  • 优缺点

    • 简单高效,但传递信息量有限(主要用于事件通知)。


3. 消息队列(Message Queue)

  • 特点

    • 基于内核,支持无亲缘关系进程通信。

    • 结构化消息(有类型)。

  • API

    • msgget(), msgsnd(), msgrcv(), msgctl()

  • 优缺点

    • 灵活、支持有序通信。

    • 管理和同步较复杂。


4. 共享内存(Shared Memory)

  • 特点

    • 多个进程共享同一块物理内存区域

    • 最快速的通信方式。

    • 通常需借助信号量互斥锁同步访问。

  • API

    • shmget(), shmat(), shmdt(), shmctl()

  • 优缺点

    • 高效。

    • 需要额外同步机制,管理复杂。


5. 信号量(Semaphore)

  • 特点

    • 用于实现进程间同步与互斥

    • 可用于保护共享资源。

  • API

    • semget(), semop(), semctl()

  • 优缺点

    • 不用于数据传输,而是控制同步。

    • 通常与共享内存结合使用。


6. 套接字(Socket)

  • 特点

    • 可用于网络通信(跨主机)或本地通信(UNIX域套接字)。

    • 面向字节流或数据报。

  • 种类

    • SOCK_STREAM(TCP)

    • SOCK_DGRAM(UDP)

    • AF_INET(IPv4网络)/ AF_UNIX(本地通信)

  • 优缺点

    • 功能强大,可进行本地或远程通信。

    • 编程复杂度较高。


7. 内存映射文件(Memory-Mapped File)

  • 特点

    • 把文件映射到内存,通过访问内存实现进程间通信。

    • 多用于共享内存的变体。

  • API

    • mmap(), munmap()

  • 优缺点

    • 效率高。

    • 需要文件系统支持,适用于大量数据通信。


三、进程间通信方式对比总结表

通信方式是否可跨进程是否需亲缘关系通信效率数据同步特点说明
无名管道不需简单、单向、父子通信
命名管道不需单向、需显式创建
消息队列有类型、结构化、较灵活
共享内存快速、高效、需同步机制
信号不适用通知机制、无数据传输
信号量同步工具,无数据传输
套接字不需网络通信首选,可跨主机
内存映射文件文件+共享内存,效率高


四、选择通信方式的建议

  • 本地小量数据通信:管道、消息队列。

  • 大数据高速通信:共享内存 + 信号量。

  • 同步与互斥:使用信号量或互斥锁。

  • 网络进程通信:使用 Socket。

  • 需持久化共享内容:考虑内存映射文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hardStudy_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值