在Linux系统中,进程间通信(Inter-Process Communication,IPC)是多个进程之间共享数据或交换信息的方式。由于Linux中的进程具有独立的地址空间,直接共享内存是不可能得,因此需要使用特定的机制来实现进程间通信。
1.管道(Pipe)
匿名管道
特性:单向通信,通常用于具有亲缘关系的进程(父子进程)。
实现:通过pipe()系统调用创建。
工作原理:
管道有两个文件描述符:一个用于写入数据,另一个用于读取数据。
数据以先进先出FIFO的方式流动
优点:简单易用,适合单向通信。
缺点:仅限父子进程使用,无法用于非亲缘关系的进程。
命名管道(FIFO)
特性:支持双向通信,且可用于非亲缘关系的进程。
实现:通过mkfifo()创建。
优点:文件系统重存在特殊文件,可用于多个进程。
缺点:需要显式管理FIFO文件。
2.信号(Signal)
特性:用于通知进程发生异步事件。
常见信号:
SIGINT:中断。
SIGKILL:终止进程。
SIGUSR1 SIGUSR2
优点:简单,适合轻量级通知。
缺点:仅传递信号编号,无法携带数据。
3.共享内存(Shared Memory)
特性:最快的IPC方式,允许多个进程共享一块内存区域。
实现:
使用shmget()创建共享内存。
使用shmat()和shmdt()连接和分离共享内存。
优点:高效,适合需要大量数据交换的场景。
确定:需要同步机制(如信号量)防止数据竞争。
4.消息队列(Message Queue)
特性:允许多个进程以消息为单位进行通信,消息带有优先级。
实现:
使用msgget()创建消息队列。
使用msgsnd()和msgrcv()发送和接收消息。
优点:支持异步通信和消息优先级。
缺点:性能较低,可能导致队列阻塞。
5.信号量(Semaphore)