Linux提供了4种用户态进程之间通信的基本方法

360影视 动漫周边 2025-09-08 16:41 1

摘要:异步性:信号可以在任何时候发送给某一进程,而无需该进程等待。有限的通信:信号本身只携带一个数字(信号编号),没有更复杂的数据结构。虽然现在可以通过sigqueue发送一些附加数据,但能力非常有限。预定义的信号:Linux定义了一系列标准信号(如 SIGKILL

本质: 一种异步通知机制。用于通知某个进程发生了某个特定事件。它是在软件层次上对中断机制的一种模拟。

特点:

异步性: 信号可以在任何时候发送给某一进程,而无需该进程等待。有限的通信: 信号本身只携带一个数字(信号编号),没有更复杂的数据结构。虽然现在可以通过sigqueue发送一些附加数据,但能力非常有限。预定义的信号: Linux定义了一系列标准信号(如 SIGKILL(9), SIGTERM(15), SIGINT(2, Ctrl+C), SIGUSR1(10)等)。kill -l 命令可以查看所有信号。处理方式: 进程可以对信号采取三种处理方式:默认行为(Terminate, Ignore, Core Dump等)。忽略信号(SIGKILL和SIGSTOP不能被忽略)。捕捉信号:进程可以注册一个信号处理函数,当信号发生时,由该函数处理。

典型应用:

终止一个进程(kill -9

)。通知进程重新加载配置(例如,许多守护进程在收到SIGHUP后会重读配置文件)。父子进程间的简单同步。

局限性: 不能用于传输复杂数据,主要是用于事件通知。

本质: 提供一个单向的字节流通信通道。

匿名管道 (Pipe):创建: 通过 int pipe(int fd[2]) 系统调用创建,返回两个文件描述符:fd[0]用于读,fd[1]用于写。特性: 具有亲缘关系的进程(如父子进程、兄弟进程)才能使用。它随进程的创建而创建,随进程的结束而消失。生命周期随进程。Shell中的 |: 就是匿名管道的典型应用。cmd1 | cmd2 将 cmd1 的 stdout 连接到 cmd2 的 stdin。命名管道 (FIFO):创建: 通过 mkfifo 命令或 mkfifo 系统调用在文件系统中创建一个特殊的设备文件(类型为p)。特性: 不相关的进程也能通过访问这个路径进行通信。生命周期与文件系统绑定,比匿名管道更持久。

共同特点:

字节流: 数据像水流一样,没有消息边界。读写的字节数可能不匹配。内核缓冲: 数据在内核缓冲区中流通。同步与阻塞: 当管道满时,写操作阻塞;当管道空时,读操作阻塞。这天然地实现了生产者-消费者模型的同步。

这是一组为进程间通信专门设计的机制,需要通过唯一的标识符(key或name)来获取。

本质: 是一个计数器,用于控制多个进程对共享资源的访问。它常被称为“锁”,但它更通用。

作用: 实现进程/线程间的同步与互斥,避免竞态条件。操作:P操作 (Wait): 尝试获取资源,信号量值减1。如果值已为0,则进程阻塞等待。V操作 (Post): 释放资源,信号量值加1,并唤醒等待的进程。System V vs POSIX: System V信号量功能强大但接口复杂(semget, semop, semctl)。POSIX信号量接口更简洁清晰(sem_open, sem_wait, sem_post, sem_close)。

本质: 一个由内核维护的链表,进程可以向他写入或读取具有特定格式和优先级的消息。

特点:有格式、有边界: 消息是作为一个整体写入和读取的,避免了管道字节流模式的解析问题。优先级: 可以给消息指定优先级,实现有优先级的通信。System V 消息队列: 使用 msgget, msgsnd, msgrcv 等系统调用。使用消息类型来区分消息。POSIX 消息队列: 使用 mq_open, mq_send, mq_receive 等系统调用。接口更现代,遵循“一切都是文件”的理念。

本质: 将同一块物理内存映射到多个进程的虚拟地址空间。这是最快的IPC方式。

原理: 因为数据不需要在内核和用户空间之间来回拷贝,进程可以直接读写内存。关键问题: 共享内存本身不提供任何同步机制。如果多个进程同时读写,会导致数据混乱。因此,共享内存通常需要与信号量或互斥锁等其他同步机制配合使用System V 共享内存: 使用 shmget, shmat, shmdt 等系统调用。POSIX 共享内存: 使用 shm_open, mmap 等系统调用,更像操作一个文件。

本质: 一种通用的通信端点,不仅可用于网络通信,也可用于同一台主机上的进程间通信(Unix Domain Socket)。

网络Socket: 用于不同主机间的进程通信,是网络编程的基础。Unix Domain Socket (UDS):用于同一台主机上的进程间通信。通过文件系统中的一个套接字文件(s类型)来标识。优点:

来源:小黄科技每日一讲

相关推荐