你好呀!
目前,我正在学习 shell 编程,在那里我刚刚学习了符号链接、硬链接、文件、目录相关的主题。我试图理解——
- 为什么一个目录有两个链接以及何时创建目录 - 为什么有。和..目录中的文件?它们是如何工作的?
- 为什么。目录中的文件是必要的吗?
好的解释会对我有帮助。
提前致谢。
最好的问候
- 纳兹穆尔
答案1
.
和条目..
始终存在于目录中。
它们并不特定于Linux;全部Unix系统拥有它们,并且POSIX是几乎要求他们。GNU赫德VSTa 也有它们。也许多路系统发明了它们。操作系统3 从Unix复制它们,所以视窗也有他们。国际研究委员会虚拟管理系统有类似的东西。
一旦某个程序(你的 shell、程序/bin/ls
、你的程序或其他使用网络电视(3),等等,等等....)使用打开目录(3),然后一些读取目录(3)将给出.
and (另一个调用readdir
将返回)..
(实际上它是底层得到凹痕(2))。
我不知道它们 -the.
和..
条目 - 是否在每个中都提供文件系统或者通过一些常见的虚拟FS内核中的层(我们不应该关心)。认为一个成功的目录(2)创建.
和..
条目(至少是由Linux内核)。
内核路径解析层适当地处理.
和..
(和/
)。读路径分辨率(7)。文件路径用于引用一个文件(实际上是一些索引节点),并且同一个文件可以有多个路径(有时没有)。
任何系统调用(列于系统调用(2)) 处理文件路径(例如打开(2),取消链接(2),统计数据(2)以及许多其他...)穿过内核中的路径解析层。
为什么
.
需要目录中的文件?
在某些情况下它非常有用。例如,您可以(通过某些程序或某些奇怪的命令)创建一个名为-r
(这是非常糟糕的品味)的文件。您可以用来rm ./-r
删除它(因为rm -r
有一些非常不同的含义)。你的 shell 使用$PATH
变量来查找可执行文件。如果您ls
在当前目录中有一些可执行文件(这也是非常糟糕的品味),您需要键入./ls
以使其运行(否则/bin/ls
很可能会在您的$PATH
目录中找到)execvp(3)或同等学历)。
原则上,您甚至可以有一个以单个回车或制表符命名的文件的目录条目,但这很恶心。如何删除它留给读者作为练习(但可以使用rm
)。
一些函数(例如dlopen(3)) 对于包含或不包含/
.看这。
一个相关的问题是为什么进程有一个工作目录(每个进程都有自己的进程,这就是为什么cd
需要是 shell 内置的)。这至少是为了方便(并且历史的原因,例如遗留问题),也为了效率。在某些系统上(想想具有 PB 磁盘的超级计算机),完整的文件路径可能非常长(例如,具有数百个字符),并且您不想键入长文件路径,或者让所有程序处理它们。也可以看看目录(2),凭证(7),chroot(2)。
在其他操作系统(尤其是 MS-DOS)上,工作目录略有不同。
顺便说一句,文件不是必须的(它们是由操作系统核心)。一些实验性的学术操作系统没有文件,因为它们正在实现一些其他的坚持层。在 20 世纪 60 年代,操作系统提供了非常不同的文件(与今天 POSIX 所要求的文件不同)。
(当您想到它们时,文件不一定是在当前计算机上组织信息的最佳方式。想想您在笔记本电脑上从数千张照片中找到一张照片或您多年前写的一封信是多么困难。希望未来的操作系统会有更好的东西)
读操作系统:三个简单的部分(可免费下载)。实施——作为练习——你自己的UNIX外壳(或者研究现有的源代码,因为它们是自由软件)。也可以看看这。