在Linux中,进程间通信有多种方式,例如共享内存、(命名)管道、套接字、消息队列。
Linux 内核和进程通信的等效或相似方式有哪些?以下是一些方法吗?
- 进程对内核进行系统调用,
- 内核向进程发送信号,
- 进程使用内核公开一些功能的文件,例如QEMU 通过其 /dev/kvm 设备节点使用 KVM
- 更多的 ...?
进程间通信可以在进程之间传输任意数据,而内核和进程之间可以传输的数据形式更加有限(根据我列出的方式),这是正确的吗?
谢谢。
答案1
进程间通信在某些方面是用户空间和内核之间通信的特殊情况,因为进程间通信始终由内核中介(至少对于设置和拆卸)。
请注意,当进程调用内核时,该进程仍在运行,但处于内核模式。因此,区分进程和内核虽然很方便,但有些不准确,并且可能会导致误解。您列出的事件确实会导致数据从用户空间传递到内核,并在内核模式下执行处理;其他例子包括
ioctl
(这实际上是一个系统调用,但非常通用,因此单独考虑它很有用);- 内存映射文件(内存映射也是实现进程之间共享内存的一种方式);
- 网络链接套接字。
可在用户空间和内核之间传输的数据的性质本质上不受任何限制;例如,write
允许您将任何内容写入文件,并且send
允许您向套接字写入任何内容。数据是否有意义取决于你在做什么;看看你自己的任何两个使用套接字的程序之间的通信是否必须存在应用层协议?问题(适用于任何形式的沟通)。