从打开的文件描述符中重新创建文件是否可能?

9

现在,这个问题可能看起来很奇怪,而且它可能确实是奇怪的,但为了给出一些背景,我一直在阅读这篇文章,学习i-node,其中作者给出了一个有趣的例子:

{
  FILE *fp;

  fp = fopen("some.hidden.file","w");
  unlink("some.hidden.file"); /* deletes the filename part */

  /* some.hidden.file no longer has a filename and is truly hidden */
  fprintf(fp,"This data won't be found\n"); /* access the data part */
  /*etc*/
  fclose(fp); /* finally release the data part */
}

这允许创建一个“隐藏”的临时文件。
我的问题是:在调用 unlink() 后,是否有任何方法可以重新创建指向由 fp 打开的 inode 的文件名?
免责声明:我不打算在实际代码中这样做;我只是(重新)学习 i-node 并想知道是否可能。

1
据我所知,没有办法给一个打开的文件描述符命名。 - Jonathan Leffler
manpage中可以得知:"如果该文件名是指向某个文件的最后一个链接,但任何进程仍然打开该文件,则该文件将保留存在,直到指向它的最后一个文件描述符被关闭。" - Bart Friederichs
@BartFriederichs:当然,那就是我给出的链接中所解释的内容。但它并没有真正回答我的问题,我的问题更多是:“在文件被销毁之前,有没有一种方法重新创建指向当前打开的“i-node”的文件?” - ereOn
打开的“file”仍会显示在/proc/"pid"/fd/下,我不确定是否可以从中创建符号链接。 - nos
1个回答

2

很遗憾,不可能实现,因为link系统调用需要一个有效的文件名(也就是说,一个已经存在的链接),而不是一个UNIX文件描述符。在Single UNIX规范中没有flink函数。


是的,但可能还有一些其他低级函数来处理i节点。我只是不知道该去哪里找 ;) - ereOn
我觉得你需要非常了解操作系统,我通过快速搜索找到了这个链接:http://www.win.tue.nl/~aeb/linux/lk/lk-8.html(第一个搜索结果,你可能需要再深入一些;我是通过搜索“内核inode处理”找到的)。 - Bart Friederichs

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