getcwd:使用符号链接

时间:2017-03-15 16:58:47

标签: unix posix

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遵循符号链接。

1 个答案:

答案 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编号)。专用的系统调用可以更快地提供相同的结果。