int
main(void)
{
char *ptr;
size_t size;
if (chdir("/usr/spool/uucppublic") < 0)
err_sys("chdir failed");
ptr = path_alloc(&size);
/* our own function */
if (getcwd(ptr, size) == NULL)
err_sys("getcwd failed");
printf("cwd = %s\n", ptr);
exit(0);
}
$ ./a.out
cwd = /var/spool/uucppublic
$ ls -l /usr/spool
lrwxrwxrwx 1 root 12 Jan 31 07:57 /usr/spool -> ../var/spool注意,chdir遵循符号链接(如我们所期望的,如图4.17所示),但是当它上升到目录树时,getcwd不知道它何时到达符号链接/usr/spool所指向的/var/spool目录。这是符号链接的一个特征。
以上都来自Rago和Stevens的“高级Unix编程”一书。
首先,chdir遵循符号链接,但是内核在进程的当前工作目录下存储什么?只有uucppublic
第二,作者想说些什么?
getcwd不知道何时命中/var/spool
据我所知,getcwd应该开始在文件夹uucppublic中读取inode of ..,以跳转到目录spool,其中包含父var,而不是usr。这就是为什么getcwd不应该关心是否存在象征性的问题。因为chdir遵循符号链接。
发布于 2017-03-15 17:15:24
看起来你有这个想法,但你分析错了英语。
getcwd不知道它何时到达符号链接/usr/spool指向的/var/spool目录
“当它命中/var/spool目录时”是整个子句的修饰符:
getcwd不知道它被符号链接/usr/spool所指向。
在这句话中,"it“是”/var/spool目录“。就像这样读吧:
getcwd不知道符号链接/usr/spool指向/var/spool目录
你取出的片段:
getcwd不知道何时命中/var/spool
不是一个有意义的片段,因为它保留了修改的"when“子句,而删除了更重要的”the“子句,该子句是”没有概念“的对象。
顺便提一句,你是从一本老书开始工作的,所以你应该意识到事情已经发生了一些变化。getcwd现在是一个syscall (至少在Linux中),所以不再使用旧的算法(遍历..和搜索匹配的inode编号)。专用的syscall更快地提供了相同的结果。
https://stackoverflow.com/questions/42816161
复制相似问题