【发布时间】:2015-03-30 07:42:24
【问题描述】:
一个进程可以做
chdir("/to/some/where");
当来自另一个外壳时
mv /to/some/where /now/different/path/
第一个过程
print getcwd();
#prints /now/different/path/
getcwd 是如何实现的? (在最低级别,例如在内核级别,inode ...)。
我知道常见的(基于 inode 的)文件系统是如何工作的,例如包含目录的内容(条目名称和相应的 inode 编号)。
编辑
问题可能含糊不清 - 试图完善它。一种可能的情况(据我们所知)
- 内核知道给定进程(和他的线程)的
CWD的inode - 例如。索引节点号1000 - 读取 inode(获取需要读取的块)
- 读取相应的块(例如打开目录)
- 读取目录条目(条目名称和 inode 编号)
- 获取
..父目录的inode号(例如900)和.(当前目录)的inode号 - 读取得到的父目录的内容
- 上一个目录的
name(对于inode1000) - 父目录的inode号
- 继续
5.- 直到到达根 inode。
也就是说,getcwd 用于
/some/very/very/very/deep/directory/level
需要更多原始 IO 操作(需要读取更多目录条目)
/tmp
整个getcwd 是由两个读数完成的?
这是正确的吗?还是完全以另一种方式完成?
【问题讨论】:
-
什么操作系统的内核?我猜您说的是 Unix 的各种变体之一,但是……如果您说的是 Linux,您是否考虑过查看源代码告诉您的内容?
-
@T.J.Crowder 我对概念层面的回答很感兴趣,当然主要是类 unix 系统,(linux,freebsd)但是如果 Windows 用另一种(已知)方式来做这件事 - 会很好知道如何... ;) 试图在数百万行内核源代码中找到它是如何在许多系统调用中实现的,对我来说可能很难。如果你知道答案,是不是太“难”告诉我? ;)
-
很高兴知道这个问题有什么问题,我如何在这个主题上展示更多的研究工作,例如我可以做些什么来改善这个问题以避免投票。 ;)
-
避免投票?在正确的地方询问。 SO是针对编程问题的-这个问题与编程无关,而是因为您要求概念级别-例如什么是“编程”——我回答了。
-
这个问题一点也不含糊。我希望答案涵盖问题的所有可能变化的整个集合/卷,而不仅仅是一个荒谬的具体(因此实际上无用)案例。机器人人通常要求后一种情况,因为他们不会思考,需要对记忆的知识进行简单的模式匹配。他们不能返回公式,因为他们不明白,但必须返回他们记住的列表。