如何重新打开已关闭的文件描述符
Posted
技术标签:
【中文标题】如何重新打开已关闭的文件描述符【英文标题】:How to re-open a closed file descriptor 【发布时间】:2012-03-30 05:25:44 【问题描述】:我有一个场景,我为两个孩子和父母之间的通信创建了管道。父级将(使用 write 函数)数据写入管道并关闭相应的文件描述符。问题是当我想再次向管道写入数据时,写入函数返回错误代码-1。我认为这是因为写作结束在之前的迭代中已经关闭。那么对应的文件描述符被关闭一次后如何打开呢。
我尝试使用需要某个文件的路径作为参数的 open() 函数。但我没有在我的应用程序中使用任何文件。我有简单的文件描述符(int arr[2])。
是否可以通过管道实现上述场景????
【问题讨论】:
【参考方案1】:一旦管道关闭,它就关闭了。你不能把它带回来。
如果你想写更多,首先不要关闭它——就这么简单。
【讨论】:
如果我们不关闭文件描述符,它不会将 EOF 发送到相应的流。所以在子进程中它将不断等待输入。但是,我想向流中写入有限次数并在管道的另一端同时读取 @chaitu: 是的,如果不关闭写端,读端就不会显示end-of-file。这意味着您需要使用文件结尾以外的其他内容来表示消息的结尾,如果您想向孩子发送更多消息(通常,您将使用固定长度的消息,以便孩子知道多长时间它是)。 @chaitu 你能发布你的解决方案或解决方法吗?【参考方案2】:关于 unix 下与文件相关的任何事情(管道也是某种文件)的知识:文件名仅用于打开文件。稍后直到文件打开,它永远可用,直到关闭,并且永远不会再次使用名称。当有人在另一个窗口打开时删除文件时,只是名称消失了,而不是文件。这意味着:
-
文件仍在磁盘上
它没有名字
它仍然开放
当它关闭时,内核会永久删除它
知道这一点可能有助于理解,为什么这几乎不可能再次“重新打开”文件、管道或类似的东西。文件名和描述符有不同的生命周期。
唯一的例外是 stdout 和 stderr,它们的描述符总是被称为 1 和 2。
【讨论】:
以上是关于如何重新打开已关闭的文件描述符的主要内容,如果未能解决你的问题,请参考以下文章