同一管道的多个读取进程都可以读取同一条消息

use*_*745 0 c unix pipe process

如果有人知道我对管道的帮助表示怀疑,

一个管道可以同时由多个进程共享,从而允许这些进程彼此交换“消息”。当同一管道有多个读取进程时,是否都可以读取同一条消息(仅发送一次而不是多个副本)?

在多线程环境中,写入管道时,进程发送的消息是否可能已损坏?

感谢收听

Wil*_*ell 5

停止思考“消息”。管道接受字节序列,并且您的应用程序完全负责将任何结构分配给该序列。写入管道的每个字节只能被读取一次,不能多次读取。如果对管道的每次写入都是固定大小且小于系统指定的数量,则写入将是原子的,并且在写入期间数据不会被“破坏”(与其他写入交错)。但是,如果任何读取器正在读取不同大小的块,则数据可能会在读取端交错。(例如,编写者将64个字节写为一个“消息”,但是读取器从管道中读取了60个字节。期望一个64字节序列的读取器将从一个尾部得到4个字节,从另一个尾部得到60个字节,并且您的数据可能显示为“已损坏”)。在多线程环境中获取“损坏的”数据非常容易。可以确保不对任何写入进行交织,但是可能很难正确处理。保持消息较小且大小固定,并确保消息使用单个write 系统调用(例如,不要在使用管道作为基础文件描述符的FILE *上使用fprintf。)

请注意,我始终在引号中使用“腐败”一词,因为我相信您的意思是交错的。从系统的角度来看,您写入的字节序列不会损坏。您可能无法获得预期的结果,但这并不是数据损坏。而是一个编程错误。