【发布时间】:2012-12-16 21:07:03
【问题描述】:
在 linux 中,哪个头文件指定了可用于写入管道的大小?
-
我捕获每个可配置周期的主应用程序的延迟并将该数据写入管道。一个单独的报告过程会读取该管道。通常,主应用程序每秒交换大约 10,000 条消息。因此,给定一秒的周期,主应用程序为每个消息交换收集 10k 延迟数据点,然后将它们写入一秒边界上的管道。在这种情况下我有以下问题
- 有没有办法在创建时指定管道的大小,这样我可以确保管道中有足够的写入空间?
- 写入管道是否昂贵?管道是如何实现的?写入管道是否会针对某些 mmap 文件或内存缓冲区?
【问题讨论】:
-
请参阅stackoverflow.com/questions/4624071/… 了解管道缓冲区大小
-
写入管道的内容会进入内核端缓冲区,一旦管道的一侧关闭,该缓冲区就会被丢弃。在 Linux 上,管道通常有 64k 缓冲区。
-
您的问题 2:没有办法配置我所知道的管道(肯定没有标准方式,如 POSIX 提供的那样)。写入管道(和读取管道)被设计为快速且廉价;它们是 Unix 中至关重要的 IPC 机制,并且必须快速。用于管道数据的内存通常在内核缓冲池中;它通常根本不会命中磁盘。 (如果管道已满,它可能会撞到磁盘,但应该读取它的进程会忽略管道足够长的时间,并且内核缓冲池上有足够的压力。)
-
我不确定这个问题是否应该结束。这里有很多问题没有在其他答案中涵盖。或许更重要的是,随着内核版本 2.6.35 改变了管道大小并使其通过 fcntl(2) 可编程,正确答案在这两年发生了变化。
-
只是成为其中的一个,下面的链接回答了 3 个问题,它不会使这篇文章完全重复。事实上,未回答的问题构成了这篇文章的大部分内容。 stackoverflow.com/questions/4624071/…