Linux中的管道是否会丢失数据?

Abh*_*ogi 14 linux posix pipe

它可以包含多少数据是否有上限?

Chr*_*odd 21

除非机器崩溃,否则它不会丢失数据.很容易误用它并认为你丢失了数据,或者是因为写入无法写入你请求的所有数据而你没有检查返回值,或者你做错了.

它可以容纳的最大数据量取决于系统 - 如果您尝试写入更多数据,您将获得一个简短的写入,或者编写器将阻塞,直到空间可用.该pipe(7)手册页包含大量有关管道有用的信息,包括(在Linux上至少)缓冲区有多大.Linux具有4K或64K的缓冲区,具体取决于版本.

编辑

Tim提到了SIGPIPE,这也是一个可能会丢失数据的潜在问题.如果读取器在读取其中的所有内容之前关闭管道,则未读取的数据将被丢弃,并且当写入更多或关闭管道时,编写器将获得SIGPIPE信号,表明已发生这种情况.如果他们阻止或忽略SIGPIPE,他们将收到EPIPE错误.这涵盖了保罗提到的情况.

PIPE_BUF是一个常量,它告诉您对缓冲区的原子写入的限制.任何大小或更小的写入都将完全成功或阻塞,直到它完全成功(或者如果管道处于非阻塞模式,则给予EWOULDBLOCK/EAGAIN).它与内核管道缓冲区的实际大小无关,但显然缓冲区的大小必须至少为PIPE_BUF才能满足原子性保证.