我目前正在构建一个自定义shell,它可以处理一些内部和外部命令沿着选项,其中一个内部命令是pwd,从pwd的手册页中,我了解到pwd -L将输出当前工作目录,即使它包含符号链接。现在为了实现这个,我想知道C中有什么功能可以提供工作目录而不需要解析符号链接。操作系统:LinuxPS:getcwd()给出了实际的路径并解析了符号链接。(如果我哪里错了请纠正我)。
pwd
pwd -L
getcwd()
zwghvu4y1#
pwd命令有两种不同的模式:
pwd -P
如果未指定选项,则假定使用-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系统调用传递给操作系统。
..
opendir("..")
errno
ENOENT
PWD
chdir
cd
$PWD
.
1条答案
按热度按时间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
系统调用传递给操作系统。