Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 同一管道的多个读取进程都可以读取相同的消息_C_Unix_Process_Pipe - Fatal编程技术网

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

C 同一管道的多个读取进程都可以读取相同的消息,c,unix,process,pipe,C,Unix,Process,Pipe,我对管道有些怀疑,如果有人知道的话,我会感激你的帮助 一个管道可以由多个进程同时共享,从而允许这些进程相互交换“消息”。 当同一管道有多个读取进程时,所有进程都可以读取同一条消息(只发送一次而不发送多个副本) 在多线程环境中,进程发送的消息在写入管道时可能已损坏 谢谢收听不要再想着“消息”。管道接受字节序列,应用程序完全负责为该序列分配任何结构。写入管道的每个字节只能读取一次,而不是多次。如果对管道的每次写入都是固定大小且小于系统指定的量,则写入将是原子的,并且在写入期间数据不会“损坏”(与其他

我对管道有些怀疑,如果有人知道的话,我会感激你的帮助

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

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

谢谢收听

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

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

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


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

第一个问题可能重复是的,好的,只有一个问题得到了答案,但第二个问题甚至不知道答案。多线程的问题……如果消息足够长并且以多次写入的方式发送,那么它可能会被破坏。你为什么这么说?写可能存在多个重复的信息或缺少信息,不理解为什么多个线程会破坏消息?第一个问题可能重复是的,可以,只有一个拿起答案,但第二个问题甚至不知道答案。多线程的问题……如果消息足够长并且以多次写入的方式发送,那么它可能会被破坏。你为什么这么说?写可以存在多个重复信息或缺少信息,不明白为什么多个线程可以破坏消息?已经感谢您的帮助。我想我理解这个想法,当它可以读取不一致的数据时。无法保证数据的一致性。但即使是现在,在这种情况下有多个线程或多个进程是不相关的,对吗?当我们同时读取多个进程或线程而不进行互斥时,可能会发生此问题。如果您有两个线程,一个在两次单独写入中写入“a”和“b”,另一个在两次单独写入中写入“c”和“d”,并且您不同步,那么您可能会得到以下任何线程:abcd、acbd、acdb、cdab、cadb或cdab。操作系统保证从管道读取的数据的读取顺序与写入顺序相同。但是,如果线程1在一次写入中写入'ab',线程2在一次写入中写入'cd',您可能会得到'abcd'或'cdab'。一致性是有保证的,但原子性只有在写入小于管道字节时才有保证。你知道读者是如何知道何时完成读取的(消息框架语义)?例如,如果我写了
a
,然后写了
b
,然后写了
c
。然后我运行了名为_pipe的猫,它只返回a,然后关闭。它如何知道“消息”在
a
处终止,而不是在
abc
处终止?它是否使用空字符?EOF字符或其他什么?@cmcdragokai每次写入后,听起来好像都要关闭管道。是否检查写入成功?如果你关闭一个fifo,然后重新打开它,你应该得到所有的数据。但没有信息框架。如果你成功地写了