跳到主要内容

IPC 简介

1. 基本概念

Linux 操作系统提供了多种进程间通信(IPC)方式。IPC 是指进程间通信的方式,是操作系统提供给不同进程进行通信的接口。

常见的 Linux IPC 机制包括:

  • 管道(pipe):管道是一种半双工通信方式,只能在具有亲缘关系的进程之间使用。管道通常用于连接父进程和子进程。
  • 套接字(socket):套接字是一种通用的、可靠的、全双工的 IPC 机制。它通过网络进行通信,可以在不同主机之间进行通信。
  • 信号量(semaphore):信号量是一种控制资源使用的机制。它可以用于控制多个进程对共享资源的访问,以避免资源冲突。
  • 共享内存(shared memory):共享内存是一种能够让多个进程访问同一块内存区域的机制。它可以用于高效地进行进程间通信。

Linux IPC 机制具有以下特点:

  • 速度快:IPC 机制通常比网络通信更快,因为它不需要经过网络层。
  • 资源共享:多个进程可以通过 IPC 机制共享内存和其他资源。
  • 灵活性高:Linux IPC 机制可以满足多种不同的通信需求,可以提供多种通信方式。
  • 可靠性高:Linux IPC 机制通常具有较高的可靠性,可以保证数据传输的正确性和完整性。
  • 可扩展性强:Linux IPC 机制可以扩展到多个主机,支持进程间通信的机器数量不受限制。

Linux IPC 机制对于多进程应用程序的开发具有重要意义。通过 IPC 机制,开发人员可以轻松地在多个进程之间传递数据和消息。这有助于提高程序的性能和可维护性。

Linux IPC 机制的使用方法因机制而异。例如,可以使用 pipe() 函数来创建管道,使用 socket() 函数来创建套接字,使用 sem_init() 函数来初始化信号量,使用 shmget() 函数来获取共享内存。详细的用法可以参考 Linux 系统的相关文档。

总之,Linux IPC 机制是 Linux 操作系统提供的一种强大的进程间通信机制。它能够满足多进程应用程序的多种通信需求,是 Linux 系统开发人员不可或缺的工具。

2. 获取 IPC 的 key

ftok() 是 Linux 系统中的一个函数,用于将一个路径名和一个数字转换为一个唯一的键值。该函数的原型如下:

key_t ftok(const char *pathname, int proj_id);

该函数接受两个参数:

  • pathname:要转换为键值的路径名。
  • proj_id:与 pathname 组成唯一键值的一个数字。

如果函数执行成功,则返回一个唯一的键值。否则,返回 -1

这个函数需要注意的几点:

  1. 如果两个参数相同,那么产生的 key值也相同。
  2. 第一个参数一般取进程所在的目录,因为在一个项目中需要通信的几个进程通常会出现在同一个目录当中。
  3. 如果同一个目录中的进程需要超过1个IPC对象,可以通过第二个参数来标识。
  4. 系统中只有一套key标识,也就是说,不同类型的IPC对象也不能重复。

3. 查看系统中的 IPC 对象

可以使用以下命令来查看或删除当前系统中的IPC对象:

  • 查看消息队列: ipcs -q
  • 查看共享内存: ipcs -m
  • 查看信号量: ipcs -s
  • 查看所有的IPC对象: ipcs -a
  • 删除指定的消息队列
    -q MSG_ID或者ipcrm -Q msg_key
  • 删除指定的共享内存
    -m SHM_ID或者ipcrm -M shm_key
  • 删除指定的信号量: ipcrm -s SEM_ID或者ipcrm -S sem_key