【问题标题】:Is it possible to recreate a file from an opened file descriptor?是否可以从打开的文件描述符重新创建文件?
【发布时间】:2013-04-16 15:44:28
【问题描述】:

现在,这个问题可能看起来很奇怪,而且很可能是,但是为了提供一些上下文,我一直在阅读 this 以了解 i-nodes,其中作者给出了一个有趣的示例:

{
  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 */
}

这允许创建一个“隐藏”的临时文件。

我的问题是:有没有办法重新创建一个指向 fp 打开的 inode 的文件名调用 unlink() 之后?

免责声明:我不打算在实际代码中这样做;我只是(重新)学习 i 节点并想知道这是否可能。

【问题讨论】:

  • AFAIK,无法为打开的文件描述符命名。
  • 来自manpage:“如果名称是文件的最后一个链接,但任何进程仍然打开该文件,则该文件将一直存在,直到最后一个引用它的文件描述符被关闭。 "
  • @BartFriederichs:当然,这就是我提供的链接中解释的内容。但它并没有真正回答我的问题,更多的是:“有没有办法在它被破坏之前重新创建一个指向当前打开的“i-node”的文件?”
  • 打开的“文件”仍将显示在 /proc/"pid"/fd/ 下,但我不确定您是否可以从中创建(符号)链接。

标签: c linux unix system inode


【解决方案1】:

恐怕这是不可能的,因为link 系统调用需要一个有效的文件名(这意味着,一个现有的链接)而不是一个 UNIX 文件描述符。 the Single UNIX Specification中没有flink函数。

【讨论】:

  • 是的,但可能还有其他一些处理 i 节点的低级函数。我只是不知道在哪里看;)
  • 你会非常特定于操作系统,我会说,我快速谷歌搜索让我来到这里:win.tue.nl/~aeb/linux/lk/lk-8.html(第一次命中,你可能想再看一点;我用谷歌搜索了“内核 inode 处理” ')。
猜你喜欢
  • 2012-03-27
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多