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

时间:2013-12-15 16:56:02

标签: c unix process pipe

如果有人知道,我对管道欣赏帮助有一些疑问

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

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

感谢您的聆听

1 个答案:

答案 0 :(得分:5)

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

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