我一直在学习 Linux 中存在的不同 IPC 机制,用于用户空间进程之间的通信。
我想问Linux中内核与用户空间进程通信的方式有哪些(与系统调用相反,用户空间发起请求)?信号可以是其中之一吗?其他的是什么?
答案1
在某些情况下,信号是典型的内核到进程的通信。当然,任何具有适当 UID 的进程都可以用来kill()
发送信号,但类似SIGCHLD
或SIGWINCH
几乎总是来自内核的信号。
具体到Linux,可以看看signalfd()
系统调用。通常的信号处理是通过“上行调用”,但signalfd()
为进程提供了不同的接收信号的方式。
系统调用的返回值可以被认为是内核到用户进程的通信。这有很大差异,但fork()
只是一个例子。父进程返回一个非零进程 ID(错误时为 -1),子进程返回零。
poll()
和系统调用select()
具有参数,其中内核在参数中设置值以指示哪些文件描述符具有可用的事件/状态更改。这更像是一个“inout”形式参数,但内核确实设置了值。
API允许通过特殊文件描述符进行inotify
内核到进程的通信。read()
如果我正确阅读了手册页,POSIX 异步 I/O 系统似乎有多种方式与用户进程通信,包括在发生 I/O 时启动线程。我从来没有做过 POSIX 异步 I/O,它看起来很棘手。