C - 多个分叉子项的命名管道

时间:2014-09-10 18:40:54

标签: c fork pipe named-pipes

如果fork()创建了多个子节点,并且与父节点的通信方法是"命名管道",您是否需要多个命名管道?每个孩子一个?或者你可以制作一个并让父母从中读出来吗?

基本上,还有什么需要做的吗?我知道如果几个孩子同时写入同一个命名管道,可能会导致从单个孩子读取整个消息时出现问题。有没有办法确保写入是原子的?

2 个答案:

答案 0 :(得分:4)

您可以使用单个管道使用多个编写器。但是,正如您所说,fork()ed子节点和父节点之间的通信,您可能根本不需要命名的管道。命名管道在文件系统中可见,可用于非父/子进程之间的通信。

关于原子性:如果写的数量少于PIPE_BUF(Linux上的不少于512字节,4096字节,来自limits.h),则写入是原子的,并且不会混合来自不同写入器的消息。如果你写的不仅仅是PIPE_BUF,那么就不要依赖写作是原子的。

PIPE(7) manual page说:

  

PIPE_BUF

     
  POSIX.1-2001 says that write(2)s of less than PIPE_BUF bytes must be
  atomic: the output data is written to the pipe as a contiguous
  sequence.  Writes of more than PIPE_BUF bytes may be nonatomic: the
  kernel may interleave the data with data written by other processes.
  POSIX.1-2001 requires PIPE_BUF to be at least 512 bytes.  (On Linux,
  PIPE_BUF is 4096 bytes.)
  

答案 1 :(得分:0)

您只能拥有一个管道,多个编写器和一个阅读器。但是为了能够正确读取,您需要具有某种数据结构。您可以做的只是为每条消息添加长度前缀。如果一个编写者想要写一些东西,比如字符串“hello”,那么它会发送0x05和字符串的字节。然后读取是统一的:读取一个字节以获得下一个要读取的字节的长度(消息的两次读取)。 在管道中写入是原子的,只要你不要写太多;不确定,但我认为PIPE_BUF常数是保证原子性的长度。