进程间通信

什么是进程间通信?

进程间通信(Inter-Process Communication, IPC)是指在不同进程之间传递数据和信息的机制。由于每个进程都有独立的地址空间,它们不能直接访问对方的内存,因此需要特殊的机制来进行通信。

主要的IPC机制

1. 管道(Pipes)

  • 匿名管道:只能在有亲缘关系的进程间使用

  • 命名管道(FIFO):可以在无亲缘关系的进程间使用

2. 信号(Signals)

  • 异步通知机制

  • 用于通知进程发生了某个事件

3. 消息队列(Message Queues)

  • 允许进程以消息形式进行通信

  • 消息可以有优先级

4. 共享内存(Shared Memory)

  • 最快的IPC机制

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

5. 信号量(Semaphores)

  • 用于进程同步

  • 控制对共享资源的访问

6. 套接字(Sockets)

  • 可用于网络通信

  • 支持不同主机间的进程通信

管道示例

# 创建管道
$ command1 | command2

# 创建命名管道
$ mkfifo mypipe
$ cat mypipe &          # 后台读取
$ echo "hello" > mypipe # 写入

信号示例

# 发送信号
$ kill -SIGTERM <pid>
$ kill -9 <pid>         # SIGKILL

# 捕获信号
$ trap "echo 'Received SIGINT'" SIGINT

共享内存示例

// C语言示例
#include <sys/shm.h>
#include <sys/ipc.h>

key_t key = ftok("/tmp", 'A');
int shmid = shmget(key, 1024, IPC_CREAT | 0666);
char *data = shmat(shmid, NULL, 0);

选择合适的IPC机制

机制
速度
复杂性
适用场景

管道

中等

简单

单向数据流

信号

快速

简单

事件通知

消息队列

中等

中等

结构化数据

共享内存

最快

复杂

大量数据

套接字

复杂

网络通信

参考资料

最后更新于