如何在linux系统的c程序中用符号链接获取当前路径(而不是实际路径)?

r3i60tvu  于 2023-03-17  发布在  Linux
关注(0)|答案(1)|浏览(145)

我目前正在构建一个自定义shell,它可以处理一些内部和外部命令沿着选项,其中一个内部命令是pwd,从pwd的手册页中,我了解到pwd -L将输出当前工作目录,即使它包含符号链接。
现在为了实现这个,我想知道C中有什么功能可以提供工作目录而不需要解析符号链接。
操作系统:Linux
PS:getcwd()给出了实际的路径并解析了符号链接。(如果我哪里错了请纠正我)。

zwghvu4y

zwghvu4y1#

pwd命令有两种不同的模式:

  • pwd -L显示 * 逻辑 * 当前工作目录。
  • pwd -P显示 physical 当前工作目录(已解析所有符号链接)。

如果未指定选项,则假定使用-L选项。
pwd -P使用getcwd()函数:它从进程的当前目录解析..链。
从当前目录(检索其inode和设备号)开始,它像opendir("..")一样打开父目录并枚举条目,直到找到一个具有相同inode和设备号的条目。此条目是当前目录名的最后一个组成部分。如果未找到此类条目,getcwd()将失败,并将errno设置为ENOENT
该过程将继续执行下一个父目录,直到到达根目录。
这是非常低效的。默认值pwd -L使用不同的方法:shell维护环境变量PWD,其中包含shell通过chdir/cd命令到达的当前目录的未解析路径。如果遵循符号链接到达当前目录或如果路径的某些部分已被重命名,则此路径可能与getcwd()获得的路径不同,因此,存储在$PWD中的路径甚至可能不再存在,或者可能通向不同的地方。
要在shell中实现pwd -L,您可以只输出PWD环境变量的值,并且应该在执行chdir/cd shell命令时更新此变量。
还要注意,对于此chdir/cd命令,相对于当前目录的路径应该通过丢弃目的地路径中的每个X1 M22 N1 X的先前分量而相对于该未解析路径在逻辑上被 * 解析 *。只有不包含...组件的结果字符串才通过chdir系统调用传递给操作系统。

相关问题