我正在尝试在程序结束时删除文件。我记得在我将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。
我需要知道我以这种方式打开的文件的名称,因为它将被其他应用程序使用。
答案 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 ...