管道
管道可以说是 Unix 系统最古老的 IPC 方式了。管道最常见的一个用法,就是将一个进程的输出导入到另一个进程的输入。譬如说,当用户执行下面的命令,ls
命令的输出将会作为wc -l
的输入:
在 Linux 系统中,管道有这些特征:
- 数据以字节流的形式在管道中传输,也就是说,数据是没有消息边界。
- 数据在管道中是单向流动的,管道的一端负责写数据,而另一端负责读数据。
- 管道的缓冲区长度是 64 KB。
- 调用
write()
写入数据时,如果指定写入的字节数不超过PIPE_BUF
(默认值是 4KB),那么 Linux 会保证这个写入操作是原子的。
下面的例子中,父进程向子进程发送多条消息:
eventfd() 与事件通知
Linux 提供了eventfd()
,作为一种事件通知方式,它可以和 select/poll/epoll 结合使用。调用eventfd()
的时候,内核会返回一个文件描述符,并创建一个 eventfd 对象,这个对象中包含一个uint64
类型的 counter。作为一种事件通知方式来说,与管道相比,eventfd()
的开销更小,因为eventfd()
只需要一个文件描述符。
eventfd()
的一个使用场景就是,通知 epoll 事件循环的退出,就如下面的例子所示: