【问题标题】:lsof showing unlinked file for more than one processlsof 显示多个进程的未链接文件
【发布时间】:2015-03-08 10:36:56
【问题描述】:

谁能解释多个进程如何保存未链接的文件?目前我看到同一个 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)

【问题讨论】:

    标签: unix inode lsof


    【解决方案1】:

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

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

    Xvnc ... > someLogFile 2>&1
    

    后来,someLogFile 被删除以(未成功)恢复空间。

    【讨论】:

      【解决方案2】:

      谁能解释未链接的文件如何被多个进程保存?

      是的,有人可以。

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

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

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

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

      【讨论】:

      • 谢谢马库斯的解释,看来这超出了我的理解。共享内存段是指在进程之间共享的信息,例如 inode 编号,以便让其他进程/线程写入同一个文件?关于第一点,从逻辑上讲,每个文件都有它的文件描述符,因此我唯一想到的是该文件已被删除。
      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 2013-10-16
      • 1970-01-01
      • 2015-09-09
      • 2014-05-09
      • 2019-07-05
      • 2019-10-17
      • 1970-01-01
      相关资源
      最近更新 更多