linux - 程序如何相互通信?

标签 linux ipc

进程如何相互通信?使用到目前为止我在编程中学到的所有知识,我无法解释套接字、文件系统和其他与在程序之间发送消息有关的事情是如何工作的。

顺便说一句,如果您要添加任何特定于操作系统的内容,我会使用基于 Linux 的操作系统。提前致谢。这个问题困扰了我好久。我也猜测内核与它有关。

最佳答案

在大多数 IPC(进程间通信)机制的情况下,您问题的一般答案是这样的:进程 A 调用内核传递一个指向缓冲区的指针,其中包含要传输到进程 B 的数据,进程 B 调用内核(或已经在调用内核时被阻塞)传递一个指向缓冲区的指针以填充来自进程 A 的数据。

此一般描述适用于 sockets , pipes , System V message queues 、普通文件等。如您所见,通信成本很高,因为它至少涉及一次上下文切换。

Signals构成一个异步 IPC 机制,其中一个进程可以向另一个进程发送一个简单的通知,触发第二个进程注册的处理程序(或者什么也不做,如果没有注册处理程序,则停止或杀死该进程,具体取决于信号)。

要传输大量数据,可以使用 System V shared memory在这种情况下,两个进程可以访问主内存的同一部分。请注意,即使在这种情况下,也需要采用同步机制,例如 System V semaphores ,这也会导致上下文切换。

这就是为什么当进程需要经常通信时,最好让它们在单个进程中成为线程。

关于linux - 程序如何相互通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9557631/

相关文章:

php - php 中的 mysql.connect_timeout 与 mysql 中的 connect_timeout

c - While 循环中的 FIFO 卡住并等待读取

linux - 如何从运行在不同内核中的不同进程控制进程

wcf - 使用 WCF 和 NetNamedPipeBinding 进行 IPC

linux - 从管道读取阻塞

linux - Bash 脚本无法正确检查目录和文件是否存在

linux - RT线程中的printf

linux - 在 bash 脚本中防止系统 sleep /关机/重启

c++ - OS X IPC 在 C 中获取进程 ID

linux - ARM 性能计数器与 linux clock_gettime