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

Open(), Close(), and Read() applied to Linux pipe file descriptiors

本文关键字:Linux 管道文件 应用于 描述 Close Open Read      更新时间:2023-10-16

这可能是一个简单的问题,但我想确认我对这些函数的理解,并可能澄清我是否完全错了。

以下是发生的事情:

我有一个多线程程序,它使用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)的任何调用都无效?

我希望这是有道理的。

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

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

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

  • pipe
  • read
  • write

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

  • open

如果你只搜索一下,还有成千上万个关于如何使用管道的例子。