实现mypwd——20175204张湲祯

实现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.输入命令进行编译运行。

原文地址:https://www.cnblogs.com/zyzgl/p/12023658.html