在linux上自动删除文件

时间:2015-01-19 16:04:20

标签: c 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。

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

3 个答案:

答案 0 :(得分:2)

取消链接文件只会将文件名与底层的inode分离,从而无法在之后使用该文件名打开文件。

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


编辑添加:

在Linux中,您可以利用/proc伪文件系统。如果您的应用程序(进程ID为PID)打开了文件描述符FD,文件名已经取消链接,它仍然可以通过告知其他应用程序在{{1 }}。它是一个伪文件,意味着它看起来像一个(不起作用的!)符号链接,但它不是 - 它只是有用的Linux内核魔术:只要另一个应用程序只是正常打开它({{ 1}} / /proc/PID/fd/FD等,没有open() / fopen()内容,他们会像访问正常文件一样获取访问权限。

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

lstat()

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

在第二个终端中,输入

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

查看该文件包含的内容。

答案 1 :(得分:1)

听起来你想要的是tmpfile()

  

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

答案 2 :(得分:0)

文件已取消关联,因此无法显示ls ...但该文件仍然存在,有一个inode,您实际上可以重新链接它...文件赢了&# 39;从磁盘中删除,直到指向它的所有文件描述符都关闭...

在fd解除链接后,你仍然可以读取和写入fd ...