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没有 当它遇到它所指向的/ var / spool目录时的想法 符号链接/ usr / spool。这是象征性的特征 链接。
以上所有内容均来自Rago和Stevens的高级Unix编程。
首先,chdir
遵循符号链接,但内核在流程的当前工作目录下存储了什么?只需uucppublic
?
其次,作者想说的是
getcwd在点击/ var / spool
时不知道
据我了解,getcwd
应该开始阅读文件夹..
中uucppublic
的inode,以便与父spool
一起跳转到目录var
,而不是{{1} }}。这就是usr
不应该关心是否存在符号的原因。因为getcwd
遵循符号链接。
答案 0 :(得分:2)
看起来你有了这个想法,但你正在解析英语错误。
getcwd不知道它何时到达/ var / spool目录,它是由符号链接指向/ usr / spool
&#34;当它到达/ var / spool目录时#34;是整个条款的修饰语:
getcwd不知道它是由符号链接/ usr / spool
指向的
在那句话中,&#34;它&#34; &#34; / var / spool目录&#34;。所以这样读:
getcwd不知道符号链接指向/ var / spool目录/ usr / spool
你抽出的片段:
getcwd在点击/ var / spool
时不知道
不是一个有意义的片段,因为它保持修改&#34;当&#34;条款但删除更重要的&#34;那&#34;作为&#34;的对象的子句不知道...&#34;
作为旁注,你正在阅读一本旧书,所以你应该知道事情已经发生了一些变化。 getcwd
现在是一个系统调用(至少在Linux中),因此不再使用旧算法(遍历..
并搜索匹配的inode编号)。专用的系统调用可以更快地提供相同的结果。