奇怪的文件系统行为,Ubuntu 9

我有两个窗口在同一台计算机上打开(Ubuntu 9,ia32,服务器)。 我会打电话给这些窗口W1和W2。

W1:

$ cd ~/test $ ls sample $ 

在W2中,我从重新创build文件test / sample的父目录运行“make”:

 $ make project . . $ cd test $ ls sample $ 

现在回到W1:

 $ ls $ cd ../test $ ls sample $ 

换句话说,在我从另外一个窗口创build并replace文件test / sample之后,ls将在第二个窗口中显示文件丢失,直到我cd ../test回到目录,然后再次出现。

如果需要,我可以提供更多的细节,但只是想知道这是否是一个众所周知的行为。

做这个实验,你会看到发生了什么事情:

 W1: cd /tmp W1: mkdir foo W1: cd foo W1: rmdir ../foo W1: ls W1: touch ./bar W2: cd /tmp W2: mkdir foo W2: cd foo W2: touch bar W2: ls W1: ls W1: touch bar 

基本上,当一个进程所在的工作目录被删除时,系统不能随便改变它的工作目录。 那将是一个巨大的安全漏洞。 所以它给了它一个假的工作目录,可以读取(给0字节)和其他各种操作,但不能在很大程度上使用。 它会碰巧与在同一个地方创build的新目录有相同的名称,但这是肤浅的。

如果你做lsof | fgrep $$ 在删除目录后,你将看到一个如下所示的条目:

 bash 2924 a_user cwd DIR 253,17 48 1327431 /tmp/joe (deleted) 

你有一个文件描述符可以打开一个目录,它的链接数已经减less到零(可能 – 你遗漏了所有的最重要的痕迹:从make) – 但是当然,作为参考举行:

 /dev/shm$ md z /dev/shm$ cd z /dev/shm/z$ rd ../z /dev/shm/z$ ls -al total 0 /dev/shm/z$ ls -dli . 9347030 drwxr-xr-x 0 me users 40 Feb 15 21:59 . 

重新创build/ dev / shm / z创build一个新的实体。

 /dev/shm/z$ md /dev/shm/z /dev/shm/z$ ls -dli . 9347030 drwxr-xr-x 0 me users 40 Feb 15 21:59 . /dev/shm/z$ ls -dli /dev/shm/z 9350877 drwxr-xr-x 2 me users 40 Feb 15 22:03 /dev/shm/z 

所有明确的行为。