2013-12-15 43 views
0

我对管有些怀疑欣赏帮助如果有人知道多个读进程都可以读出相同的消息

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

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

感谢收听

+0

[Unix上有多个阅读器的命名管道(FIFO)]的可能的重复](http://stackoverflow.com/questions/1634580/named-pipes-fifos-on-unix-with-multiple-readers) – jweyrich

+0

第一个问题是的,好的,只有一个人可以找到答案,但第二个问题甚至不知道答案。多线程的问题..... – user2989745

+0

如果消息足够长并以多次写入发送,则是可以被破坏。 – egur

回答

3

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

请注意,I因为我相信你的意思是交错的,所以在整个引用中都使用了“损坏”一词。从系统角度来看,您编写的字节序列不会被破坏。你可能无法得到你期望的结果,但这不是数据的腐败。相反,这是一个编程错误。

+0

已经感谢您的帮助。 我想我理解这个想法的时候,它可以读取不一致的数据。数据的一致性不能保证。但即使是现在,在这种情况下是不是有多个线程或多个进程的权利?当我们有多个进程或线程同时读取而没有互斥时,可能会发生此问题。 – user2989745

+0

如果你有两个线程,一个在两个独立的写入中写入'a','b',另一个在两个独立的写入中写入'c','d'并且你不同步,那么你可能会得到以下任何一个: abcd,acbd,acdb,cdab,cadb或cdab。操作系统保证从管道读取的数据按照写入的顺序读取。但是,如果线程1在单个写入中写入'ab',并且线程2在单个写入中写入'cd',则可能会得到'abcd'或'cdab'。一致性是有保证的,但只有在写入数据小于PIPE_BUF字节时才能保证原子性。 –

+0

你知道读者如何知道它何时读完(消息框架语义)?例如,如果我写了'a',然后'b',然后'c'。然后我运行'cat named_pipe',它只返回'a',然后关闭。它如何知道“消息”在'a'而不是在'abc'终止?它是否使用空字符? EOF角色还是别的? – CMCDragonkai

相关问题