gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:57:19 28 4
gpt4 key购买 nike

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

这是发生了什么:

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

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

我写入管道的字节数是可变的,因此这在从管道读取时会带来一些困难。我相信我在某处读到使用 close(my_pipe_file_descriptor) 会引发 EOF。如果是这种情况,read() 将在遇到 EOF 时返回 - 这会很棒。

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

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

我希望这是有道理的。

最佳答案

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

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

我建议您阅读 official POSIX references :

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

如果您稍微搜索一下,还有数以千计的关于如何使用管道的示例。

关于c++ - Open()、Close() 和 Read() 应用于 Linux 管道文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31065301/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com