您的位置:首页 > 其它

2017-2018-1 20155216 《信息安全系统设计基础》 实现mypwd

2017-11-17 19:50 351 查看

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);

}

4、测试pwd命令

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐