这可能是一个简单的问题,但我想证实我对这些功能的理解 - 并且可能澄清我是否完全错误。
这是发生了什么:
我有一个多线程程序,它使用unix pipe()
函数通过管道传递数据。基本上,两个线程可以写入管道(它们当然是同步的),只有一个可以从管道读取。
根据我的理解,read()
命令将尝试从传递的文件描述符参数中读取x
个字节数,如果达到EOF
,它将返回0。
我写入管道的字节数是可变的,因此从管道读取时这会带来一些小难度。我相信我在close(my_pipe_file_descriptor)
使用EOF
投掷的地方读到了。如果是这种情况,read()
会在点击EOF
后返回 - 这会很棒。
如果我上面所说的是正确的 - 参考close()
和read()
的工作原理 - 我有一个问题。
如果我致电close(my_pipe_file_descriptor)
,管道是否已被销毁,以后对open(my_pipe_file_descriptor)
的任何来电都无效?
我希望这是有道理的。
答案 0 :(得分:4)
对于close
的问题,是的,它会破坏管道,您无法再在关闭它的过程中使用它。如果要使用新管道,则必须再次创建一个管道。如果关闭管道的写入端,则读取端仍然有效,允许读取器读取,直到收到所有数据。最后一点意味着编写器不必等到它知道读者已经收到所有数据(通常不能反复),而只是写出它想要的任何数据,然后关闭它的管道末端。 / p>
正如您对read
函数的理解,它基本上是正确的。您要求它读取一定数量的字节,它将读取最多该字节数。它可能读得少,你必须检查返回的值,以确切了解它读取了多少。这不仅适用于管道,也适用于套接字和文件。
我建议您阅读official POSIX references:
为了完整起见(即使它不能用于打开或创建匿名管道):
如果你只是搜索一下,还有成千上万的关于如何使用管道的例子。