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

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

我在同一台机器 (Ubuntu 9,ia32,服务器) 上打开了两个窗口。我将这些窗口称为 W1 和 W2。

W1:

$ cd ~/test  
$ ls  
sample  
$  

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

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

现在回到 W1:

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

换句话说,在我从另一个窗口构建并且文件 test/sample 被替换后,ls 会在第二个窗口中显示该文件丢失,直到我cd ../test返回目录后它才会重新出现。

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

答案1

做这个实验,你就会明白发生了什么:

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 字节)和各种其他操作的假工作目录,但不能大量使用。它恰好与在同一位置创建的新目录同名,但这只是表面现象。

lsof | fgrep $$如果在删除目录后执行此操作,您将看到如下条目:

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

答案2

您(或您的 shell)有一个打开文件描述符的目录,该目录的 nlink 计数已减少为零(可能 — 您遗漏了最重要的痕迹:来自 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 .

重新创建 /dev/shm/z 将创建一个新实体。

/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

所有明确定义的行为。

相关内容