【问题标题】:Can a pipe (from pipe syscall) have bi-directional communication?管道(来自管道系统调用)可以进行双向通信吗?
【发布时间】:2019-11-30 15:22:11
【问题描述】:

来自https://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html

可以将数据写入文件描述符 fildes[1] 并从 文件描述符 fildes[0]。读取文件描述符 fildes[0] 应访问写入文件描述符 fildes[1] 的数据 先进先出的原则。未指定 fildes[0] 是否也是 open for writing 以及 fildes[1] 是否也开放阅读。

据我了解,当您像pipe(array) 这样调用管道系统调用时,array[0] 用于读取,array[1] 用于写入。但是,它们可以同时用于读取和写入吗?

我知道我可以创建另一个管道以反向写入/读取,但是可以在同一个管道中完成吗?文档的含义

不确定是否...

【问题讨论】:

  • 管道是一种单向通道,尽管我认为可以对自己进行相同的读写过程,但这并不是它的真正用途。如果您想要另一个单向通道,则必须创建第二个管道(或者:您可以使用 UNIX 域套接字,它是一种双向通道,类似于网络连接)。
  • 双向管道仅适用于 BSD。如果你想做一个可移植的双向管道,请使用 unix 域socket pair

标签: c


【解决方案1】:

据我了解,当您像pipe(array) 这样调用管道系统调用时,那么 array[0] 用于阅读,array[1] 用于写作。

是的。

但是,他们可以 读写都可以吗?

不,pipe() 函数不提供此功能,除非作为扩展。标准管道是单向通信通道。

但是,如果非常小心,那么单个管道可能可用于双向通信。任意数量的线程或进程可以写入管道的写入端,并且任意数量的相同或其他线程或进程可以从读取端读取。然而,在大多数情况下,依靠这些特性在单个管道上进行可靠的双向通信需要更多的同步和协调。

对于双向通信,通常的方法是创建两个管道,每个方向一个。你也可以考虑socketpair()——这似乎不太常见,但它产生的情况更像你可能想到的:两个文件描述符,一个用于双向通信通道的每个端点。

【讨论】:

  • 谢谢。我之所以这样问,是因为我需要向 OpenVPN 传递一个具有写入/读取属性的文件描述符。此文件描述符代替 /dev/net/tun 的文件描述符传递。 OpenVPN 使用此 FD 作为写入和读取 IP 数据包的一种方式。考虑到这一点,我应该打开哪种类型的套接字对?这里:pubs.opengroup.org/onlinepubs/9699919799/functions/… 它显示了 3 种类型,但我不确定哪一种是正确的。
  • @GuerlandoOCs,我没有足够的关于 OpenVPN 要求的信息来自信地回答,但可能SOCK_STREAM 类型的套接字将具有适当的特征。然而,这不是您需要选择的唯一参数。您还需要选择要使用的传输系列(“地址系列”),为此我建议从 AF_UNIX 开始。
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
相关资源
最近更新 更多