2017-2018-1 20155216 《信息安全系统设计基础》 实现mypwd
作业要求:
1、学习pwd命令
2、研究pwd实现需要的系统调用(man -k; grep),写出伪代码
3、实现mypwd
4、测试mypwd
1、学习pwd命令
pwd 命令查看默认工作目录的完整路径
-L 目录连接链接时,输出连接路径
-P 输出物理路径
当前目录被删除了,而pwd命令仍然显示那个目录
2、研究pwd命令
使用 man -k
查看系统调用
伪代码:
1、根据inode-number ,在当前目录中查找对应的文件名
2、限制最大的目录深度
3、记录目录名的栈
4、通过特殊的文件名“.”获取当前目录的inode-number
5、通过特殊的文件名“..”获取当前目录的父级目录的inode-number
6、判断当前目录和上级目录的inode-number是否一样
7、如果两个inode-number一样说明到达根目录
8、如果两个inode-number不一样
9、切换至父级目录,根据步骤1获取的inode-number,在父级目录中搜索对应的文件名并记录下来, 重新回到步骤1
10、如果路径名太深,则提示
11、输出完整路径名
3、实现pwd命令:
C语言代码:
#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);
int getinode(char *);
int main()
{
printpath();
putchar('\n');
return ;
}
void printpath()
{
int inode,up_inode;
char *str;
inode = getinode(".");
up_inode = getinode("..");
chdir("..");
str = inode_to_name(inode);
if(inode == up_inode) {
// printf("/%s",str);
return;
}
printpath();
printf("/%s",str);
}
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);
}