gpt4 book ai didi

c - linux自动删除文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:18 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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


编辑添加:

在 Linux 中,您可以利用 /proc 伪文件系统。如果您的应用程序(具有进程 ID PID)打开了文件描述符 FD,并且文件名已经取消链接,它仍然可以通过告诉另一个应用程序让另一个应用程序处理它在 /proc/PID/fd/FD 上工作。它是一个伪文件,这意味着它看起来像一个(无功能!)符号链接(symbolic link),但它不是——它只是有用的 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

查看该文件包含的内容。

关于c - linux自动删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28028783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com