这可能是一个简单的问题,但我想确认我对这些函数的理解 - 如果我对它们完全错误,可能会得到澄清。
事情是这样的:
我有一个多线程程序,它使用 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 参考资料