应用于 Linux 管道文件描述符的 Open()、Close() 和 Read()

Mla*_*gma 3 c++ linux pipe

这可能是一个简单的问题,但我想确认我对这些功能的理解 - 如果我对它们完全错误,可能会澄清。

这是发生了什么:

我有一个多线程程序,它使用 unixpipe()函数通过管道传递数据。基本上,两个线程可以写入管道(当然它们是同步的),并且只有一个线程可以从管道中读取。

根据我的理解,该read()命令将尝试x从传递的文件描述符参数中读取字节数,如果EOF达到,它将返回 0 。

我写入管道的字节数是可变的,因此从管道读取时这会带来一个小困难。我相信我在某个地方读到过使用close(my_pipe_file_descriptor)throws in EOF。如果是这种情况,read()一旦命中就会返回EOF- 这会很棒。

如果我上面说的是正确的 - 关于如何close()read()工作 - 我有一个问题。

如果我调用close(my_pipe_file_descriptor),管道是否被破坏,使以后的任何调用open(my_pipe_file_descriptor)无效?

我希望这是有道理的。

Som*_*ude 5

对于关于 的问题close,是的,它会破坏管道,您不能再在关闭它的过程中使用它。如果你想使用一个新的管道,你必须重新创建一个。如果关闭管道的写入端,则读取端仍然有效,允许读取器读取直到接收到所有数据。最后一点意味着写入器不必等到它知道读取器已收到所有数据(它通常无论如何都不能),而只需写入它想要的任何数据,然后关闭管道的末端。

根据你对read函数的理解,基本正确。你要求它读取一定数量的字节,它会读取那个字节数。它可能读取的更少,您必须检查返回值以准确了解它读取了多少。这不仅适用于管道,也适用于套接字和文件。

我建议您阅读官方的 POSIX 参考资料

为了完整起见(即使它不能用于打开或创建匿名管道):

如果您稍微搜索一下,还有成千上万个关于如何使用管道的示例。