Open()、Close()和Read()应用于Linux管道文件描述符
Open(), Close(), and Read() applied to Linux pipe file descriptiors
这可能是一个简单的问题,但我想确认我对这些函数的理解,并可能澄清我是否完全错了。
以下是发生的事情:
我有一个多线程程序,它使用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
如果你只搜索一下,还有成千上万个关于如何使用管道的例子。
- Java System.loadLibrary 不会在 /usr/lib/x86_64-linux-gnu/ 文件夹中查
- 如何在 C++ 中创建一个适用于 Windwos 和 Linux 的文件夹(目录)
- 如何从 linux 二进制文件中存储和检索数据
- 递归执行C 中的Linux管道命令
- Linux复制文件连接到节点JS / Python / C / C 之后
- Linux插座文件描述符通常适合哈希
- Linux 阻止文件描述符在程序退出时关闭
- 使用 ubuntu Linux 的 c++ 文件重定向和编码问题
- 如何使用 qt 将 Linux 文本文件转换为 Windows 文本文件
- 关于 Linux .so 文件无法链接到主文件.cpp文件
- 使用C++和Linux编写文件
- 无法使用 istream 和 ostream 指针跨 Linux 管道写入
- 如何在 Linux 的C++文件中包含自定义头文件
- 找不到Linux-SO文件
- linux内核.h文件中定义的宏
- 用Xcode编写的C++程序为Linux制作文件
- 我可以提供我的程序的linux二进制文件与我的系统的共享库吗?
- 为什么linux管道和标准输出不能一起工作
- c++: Linux:管道到我的程序从多个线程或流,而不是' cout '
- Open()、Close()和Read()应用于Linux管道文件描述符