lsof 显示多个进程的未链接文件

lsof showing unlinked file for more than one process

谁能解释一下未链接的文件是如何被多个进程持有的?目前我看到同一个 inode 1543

有四个进程
# /usr/local/bin/lsof +aL1 /dev/vg00/lvol4

Xvnc      20622 p32adm    2u   REG 64,0x40004 4587683840     0 1543 /home (/dev/vg00/lvol4)
vncconfig 20649 p32adm    1u   REG 64,0x40004 4587683840     0 1543 /home (/dev/vg00/lvol4)
vncconfig 20649 p32adm    2u   REG 64,0x40004 4587683840     0 1543 /home (/dev/vg00/lvol4)
xterm     20650 p32adm    1u   REG 64,0x40004 4587683840     0 1543 /home (/dev/vg00/lvol4)
xterm     20650 p32adm    2u   REG 64,0x40004 4587683840     0 1543 /home (/dev/vg00/lvol4)
twm       20651 p32adm    1u   REG 64,0x40004 4587683840     0 1543 /home (/dev/vg00/lvol4)
twm       20651 p32adm    2u   REG 64,0x40004 4587683840     0 1543 /home (/dev/vg00/lvol4)

can anyone explain how unlinked file can be held by more than one process?

是的,有人可以。

首先,它现在取消链接的事实并不一定意味着它在进程获得文件句柄时就取消了链接。

但是看看你的列表,我认为这些是共享内存段之类的东西,不需要在某处有文件系统节点。

编辑:OP 在评论中要求解释共享内存段,所以这里是:

现代 CPU 和操作系统将进程的地址空间相互隔离,因此进程 A 无法访问进程 B 的内存。如果现在 A 和 B 需要交换信息,一种方法是询问操作系统将一些地址映射到各自的内存空间,这些内存空间对于两个进程都是/相同的/内存。这些段需要句柄,而这些句柄就是我所指的。如需更多信息,man shm_overview.

虽然没有特别的理由期望不同的进程不共享未链接的文件,正如 Marcus Müller 已经回答的那样,但在您的情况下,这些文件是进程 stdoutstderr.

我猜这些进程都从以这种方式启动的原始命令中继承了这些文件描述符:

Xvnc ... > someLogFile 2>&1

之后,someLogFile 被删除以(未成功)恢复 space。