我有两个窗口在同一台计算机上打开(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
所有明确的行为。