实现mypwd
任务详情
- 学习pwd命令
- 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
- 实现mypwd
- 测试mypwd
关于pwd命令
- 命令功能:查看”当前工作目录“的绝对路径
- 参数:
- 一般情况下不带任何参数
-L
:显示当前的路径,有连接文件时,直接显示连接文件的路径,(不加参数时默认此方式)。-p
:显示当前的路径,有连接文件时,不使用连接路径,直接显示连接文件所指向的文件;当包含多层连接文件时,显示连接文件最终指向的文件。--help
:显示帮助信息。--version
:显示版本信息。
- Linux下
pwd
man pwd
- 查看相关系统调用函数信息:
man -k dir | grep 2
getcwd()
:getcwd(char *buf,size_t size)
- 将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小
readdir()
:readdir(DIR* dir)
返回参数dir 目录流的下个目录进入点- 需要搭配
opendir()
使用:opendir (const char * path )
获取path子目录下的所由文件和目录的列表,如果path是个文件则返回值为NULL - 对于它的实现,我们首先要知道,目录在Linux中其实也是一种文件,所以它也是由
inode+数据块
构成的,每一个列表记录inode-number+filename
chdir()
:int chdir(const char *path )
用于改变当前工作目录,调用参数是指向目录的指针,调用进程需要有搜索整个目录的权限。
伪代码实现
- 通过上面我们可以发现可以通过两种函数来实现
pwd
命令 - 对
getcwd()
:定义一个缓冲区数组buf[MAXPATH]; 调用getcwd(buf, MAXPATH); 输出返回值即为路经;
- 对
readdir()
:1. 通过特殊的文件名"."获取当前目录的inode-number(假设当前目录为a) 2. 通过特殊的文件名".."获取当前目录的父级目录的inode-number 3. 判断当前目录和上级目录的inode-number是否一样 4. 如果两个inode-number一样说明达到根目录,输出完整路径,退出程序 5. 如果两个inode-number不一样,切换至父级目录,根据步骤1获取的inode-number,在父级目录中搜索对应的文件名并记录下来,然后重新回到步骤1
代码实现
实现截图
getcwd()
:
readdir()
: