【问题标题】:auto delete file on linuxlinux下自动删除文件
【发布时间】:2015-01-19 16:04:20
【问题描述】:

我正在尝试在程序结束时删除文件。我记得在我可以将unlink() 放在第一个close() 之前之前,我不需要重新打开文件。

我的期望:程序结束后文件被删除。

发生了什么:当调用取消链接时文件被删除。文件被删除。

我的示例程序:

int main()
{
    int fd = open(argv[1], O_CREAT);
    int x = 1;
    write(fd, "1234\n", 5);
    close(fd);

    fd = open(argv[1], 0);
    unlink(argv[1]);

    while (x <= 3)
    {
      int k;
      scanf(" %d", &k);

      x++;
    }

    close(fd);
    return 0;
}

有办法让我open() 文件,与之交互并在close() 上从硬盘中删除文件吗?我正在使用 fedora linux 18。

我需要知道我以这种方式打开的文件的名称,因为它将被另一个应用程序使用。

【问题讨论】:

  • it is not working now 你能描述一下如何吗?发生的事情是否与您的预期不同?你有错误吗?
  • 为什么要打开文件删除它然后关闭它?打开文件关闭它然后删除它不是正确的做法吗?
  • @iharob 这有更多的保证,在他使用文件时没有人会尝试修改文件......
  • 它在我的情况下运行良好(OSX),我不明白为什么它不能在你的平台上运行。详细描述您的问题...
  • 存在flock();

标签: c linux


【解决方案1】:

取消链接文件只是将文件名从底层 inode 中分离出来,之后就无法使用该文件名打开文件。

如果任何进程的文件仍然打开,他们可以愉快地读写它,因为这些操作是在 inode 而不是文件名上操作的。此外,如果还有硬链接(其他文件名引用相同的 inode),则可以使用这些其他文件名来打开文件。参见例如更多详细信息,请参阅inodes 上的维基百科文章。


编辑添加:

在 Linux 中,您可以利用 /proc 伪文件系统。如果您的应用程序(进程 ID PID)打开了文件描述符 FD,并且文件名已经取消链接,它仍然可以通过告诉另一个应用程序处理 /proc/PID/fd/FD 来让另一个应用程序处理它。它是一个伪文件,这意味着它看起来像一个(不起作用!)符号链接,但它不是——它只是有用的 Linux 内核魔法:只要其他应用程序正常打开它(open()/@987654327 @ 等,没有 lstat()/readlink() 的东西),他们将像打开普通文件一样获得访问权限。

作为一个真实的例子,打开两个终端,一次写入

bash -c 'exec 3<>foobar ; echo $$ ; rm foobar ; echo "Initial contents" >&3 ; cat >&3'

它输出的第一行是PID,这里FD是3。您键入的任何内容(按 Enter 后)都将附加到一个简短命名为 foobar 但不再存在的文件中。 (您可以轻松地验证这一点。)

在第二个终端中,输入

cat /proc/PID/fd/3

查看该文件包含的内容。

【讨论】:

  • 是的,但我认为文件在我关闭之前消失的事实是错误的。如果它消失了,另一个程序在不知道 inode 的情况下无法打开它。
  • @RicardoLucca:告诉其他进程使用/proc/PID/fd/FD,其中PID是原进程pid,FD是原进程中的文件描述符。有关详细信息,请参阅我编辑的答案。
【解决方案2】:

听起来你真正想要的是tmpfile()

tmpfile() 函数打开一个唯一的二进制临时文件 读/写 (w+b) 模式。该文件将被自动删除 关闭或程序终止。

【讨论】:

  • 抱歉,我需要知道文件名。是否可以通过 open/fopen 模拟它?
【解决方案3】:

该文件未链接,因此不会从ls 显示...但该文件仍然存在有一个 inode 并且您实际上可以重新链接它...该文件不会从中删除磁盘直到所有指向它的文件描述符都被关闭...

在 fd 取消链接后打开时,您仍然可以读取和写入 fd...

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 2018-03-12
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多