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