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

问题描述 投票:0回答:2

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

事情是这样的:

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

我希望这是有道理的。

c++ linux pipe
2个回答
5
投票

关于

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

按照你对

read
函数的理解,基本上是正确的。您要求它读取一定数量的字节,它会读取“最多”该字节数。它可能读取的内容较少,您必须检查返回值才能准确了解它读取了多少内容。这不仅适用于管道,也适用于套接字和文件。 我建议您阅读

官方 POSIX 参考资料

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

  • open
    
    
  • 只要稍微搜索一下,还有数千个关于如何使用管道的示例。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.