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/

相关文章:

Linux屏幕输入自动响应

python - 比较两个文件在 python 中的差异

linux - 在 linux 上使用私有(private) C++ 运行时库

linux - 如何知道哪个 ttyS* 文件链接到哪个串行端口?

java - 无法使用 ProcessBuilder 运行程序,从命令行运行正常

linux - 操作系统内 2 个进程之间的双向消息传递

linux - 基于 Qt 的程序 : Memory usage continues to grow

linux - 是否可以使用 Git 扩展或 Git GUI 来管理远程 linux ftp 服务器上的文件,如本地存储库

php - 我将如何使用 PHP 对 Linux 用户和密码进行身份验证?

linux - 在Linux PowerShell和Linux bash中使用 'rm -rf'