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