在 linux 上自动删除文件

auto delete file on linux

我正在尝试在程序结束时删除文件。我记得在我可以将 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.

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

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

The tmpfile() function opens a unique temporary file in binary read/write (w+b) mode. The file will be automatically deleted when it is closed or the program terminates.

取消链接文件只是将文件名与底层 inode 分离,使得之后无法使用该文件名打开文件。

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


编辑添加:

在 Linux 中,您可以利用 /proc 伪文件系统。如果您的应用程序(具有进程 ID PID)打开了文件描述符 FD,并且文件名已经取消链接,它仍然可以通过告诉另一个应用程序处理 [=15] 让另一个应用程序处理它=].它是一个伪文件,意味着它看起来像一个(无功能!)符号链接,但它不是——它只是有用 Linux 内核魔法:只要其他应用程序正常打开它(open()/fopen() 等,没有 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

查看该文件包含的内容。

该文件未link编辑,因此它不会从 ls 中显示...但该文件仍然存在,有一个索引节点,您实际上可以重新 link 它...文件不会从磁盘中删除,直到所有指向它的文件描述符都关闭...

在 fd 被取消linked 后,您仍然可以在打开时读写 fd...