如何重新打开一个关闭的文件描述符

8
我有一个场景,我创建了一个管道来实现两个子进程和父进程之间的通信。父进程使用write函数将数据写入管道,并关闭相应的文件描述符。问题是当我想再次向管道写入数据时,write函数返回错误代码-1。我认为这是因为写入端在先前的迭代中已经关闭了。那么,一旦关闭了相应的文件描述符,如何重新打开它呢?
我尝试使用open()函数,该函数需要文件路径作为参数。但是我在我的应用程序中没有使用任何文件,只有简单的文件描述符(int arr[2])。
是否可能使用管道实现上述场景?
2个回答

17

一旦管道关闭,就无法重新打开。

如果你想再写些东西,首先不要关闭它 - 就这么简单。


6
如果我们不关闭文件描述符,它就不会向相应的流发送EOF。因此,在子进程中,它将持续等待输入。但是,我想有限次地向流写入,并在管道的另一端并发读取。 - chaitu
1
@chaitu:如果您不关闭写入端口,则读取端口将不会显示文件结尾。这意味着,如果您想向子进程发送更多消息,则需要使用其他东西来表示消息的结尾(通常,您会使用固定长度的消息,以便子进程知道其长度)。 - caf
@chaitu,你能发布一下你的解决方案或变通方法吗? - Brishna Batool

2
关于与文件相关的任何事情(管道也是一种文件)在Unix下需要知道的事情:文件名仅在打开文件时使用。稍后,直到文件被打开,它将永远可用,直到关闭,并且名称不再使用。当有人在另一个窗口中删除打开的文件时,只有名称消失了,而不是文件本身。这意味着:
  1. 文件仍然存在于磁盘上
  2. 它没有名称
  3. 它仍然是打开状态
  4. 当它关闭时,内核会永久删除它
了解这一点可能有助于理解为什么几乎不可能“重新打开”文件、管道或类似的东西。文件名和描述符具有不同的生命周期。
唯一的例外是stdout和stderr,它们的描述符始终被称为1和2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接