实现mypwd
任务要求:
1 学习pwd命令
2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
3 实现mypwd
4 测试mypwd
提交过程博客的链接
任务一:学习pwd命令
任务步骤:
1.pwd命令详解:
pwd命令功能是显示当前所在工作目录的全路径吗,可以通过pwd来查看当前目录的绝对路径。
2.pwd命令参数:
-L:--logical,显示当前的路径,有连接文件时,直接显示连接文件的路径,(不加参数时默认此方式)。
-p:--physical,显示当前的路径,有连接文件时,不使用连接路径,直接显示连接文件所指向的文件。 当包含多层连接文件时,显示连接文件最终指向的文件。
3.在Linux下学习pwd命令:
使用man pwd
使用man -k pwd
学习
4.使用pwd命令
任务二:研究pwd实现需要的系统调用(man -k; grep),写出伪代码
任务步骤:
1.pwd实现原理:pwd以绝对路径打印当前的工作目录,可以从当前目录逐层向根目录进行查找,当找到根目录,即可得到完全路径。而系统通过inode来管理文件,每个文件都有inode号(目录是特殊的文件,每个目录下有两个特殊的文件名.(当前目录)和..(父目录))。不断向前寻找到达根目录时没有父目录,两个特殊的文件名.和..仍然存在于根目录中,他们inode号相同表示同一目录。当不断查找的inode号与最初目录的inode号相同时为最终的路径。
2.利用man -k directory | grep 3
查找与路径相关的库函数,并利用命令学习getcwd,getwd函数。
3.伪代码
1.获得当前文件的inode号
2.不断向前寻找直到从根目录中找到inode相同的值,找到相应的文件名
3.输出路径
任务三:实现mypwd
任务步骤:
1.实现代码
#include<stdio.h>
#include<sys/stat.h>
#include<dirent.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
void printpath(); //输出路径
char *inode_to_name(int); //不断寻找找到与ionde相同的值,并获得文件名
int getinode(char *); //获得inode号
int main()
{
printpath();
putchar('
');
return ;
}
int getinode(char *str)
{
struct stat st;
if(stat(str,&st) == -1){
perror(str);
exit(-1);
}
return st.st_ino;
}
char *inode_to_name(int inode)
{
char *str;
DIR *dirp;
struct dirent *dirt;
if((dirp = opendir(".")) == NULL){
perror(".");
exit(-1);
}
while((dirt = readdir(dirp)) != NULL)
{
if(dirt->d_ino == inode){
str = (char *)malloc(strlen(dirt->d_name)*sizeof(char));
strcpy(str,dirt->d_name);
return str;
}
}
perror(".");
exit(-1);
}
void printpath()
{
int inode,up_inode;
char *str;
inode = getinode(".");
up_inode = getinode("..");
chdir("..");
str = inode_to_name(inode);
if(inode == up_inode) {
return;
}
printpath();
printf("/%s",str);
}
任务四:测试mypwd
任务步骤:
1.输入命令进行编译运行。