<分区>
在 Linux 上,假设一个进程打开一个文件进行写入,某些东西删除了该文件(可能是配置错误的日志轮换),但该进程继续运行,保持文件句柄打开,并继续写入。我的理解是,在这种情况下,文件使用的存储仍然存在于磁盘上,直到进程终止。
假设我想读取那个文件。是否有任何方法可以让另一个进程打开该文件句柄指向的文件,或者以其他方式访问写入其中的数据?
标签 linux
<分区>
在 Linux 上,假设一个进程打开一个文件进行写入,某些东西删除了该文件(可能是配置错误的日志轮换),但该进程继续运行,保持文件句柄打开,并继续写入。我的理解是,在这种情况下,文件使用的存储仍然存在于磁盘上,直到进程终止。
假设我想读取那个文件。是否有任何方法可以让另一个进程打开该文件句柄指向的文件,或者以其他方式访问写入其中的数据?
最佳答案
是的,可以。通过 /proc/$pid/fd/$fd
。
例子:
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int fd;
if(0>(fd = open("DELETED", O_CREAT|O_RDWR|O_CLOEXEC, 0600))) return perror("open"),1;
static char const msg[]="got me\n";
(void)write(fd, msg, sizeof(msg));
if(0>(unlink("DELETED"))) return perror("unlink"),1;
char buf[128];
sprintf(buf,"cat /proc/%ld/fd/%d", (long)getpid(), fd);
system(buf);
}
(这里我从一个(n 间接)子进程访问它,但这不是必需的。它也适用于不相关的进程。)
/proc/$pid/fd/$fd
项在文件系统中显示为符号链接(symbolic link)。
它们通常指向打开文件的名称,但是当文件被删除时,原始链接目标有一个 "(deleted)"
附加到它,如
lrwx------ 1 petr petr 64 Aug 19 12:45 /proc/32027/fd/3 -> '/home/petr/DELETED (deleted)'
尽管这样的目标不存在,但这样的 proc 符号链接(symbolic link)仍然有效(大概是通过一些黑暗的内核魔法)。
关于linux - 如果一个文件已经被删除,但是一个进程仍然持有一个文件句柄,另一个进程可以访问它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555105/