java unsigined short_20165235 实现pwd功能

20165235 实现pwd功能

要求

学习pwd命令 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3.实现mypwd

测试mypwd

实现过程

pwd是将当前的文件目录的绝对路径打印出来,所以要找到一个函数可以返回当前文件目录名。所以在命令行中输入man -k dir | grep get得到如下的信息:

2a28b107f7d2fc04b3eb779e0007d55a.png

如上图:getwd正是我们所需要的,通过命令输入:man getwd得到如下信息:

58f5b77895d65793654d6b40897930ab.png

如上图:它所需的头文件和函数以及参数一目了然。getwd():函数功能描述:将当前工作目录的绝对路径复制到数组指针buf中。 -根据以上信息编写代码:

#include

#include

int main(){

char a[100];

getwd(a);

printf("%s\n",a);

return 0;

}

编译代码并且运行,结果如下:

1c45fcd53830ac57d16e47636faa9b5c.png 但是发现以上代码过于简单,是否有一种方法是可以通过操作目录文件来进行实现pwd功能。所以有以下伪代码:

1.打开文件目录查看所有目录如果查到当前目录中有两个相同的" ."文件说明已经到了文件根目录,也就是说本目录的i-node与上级目录的i-node相同。

2.否则进入".."文件目录,并且将上一级件目录名记录添加到数组中

3.直到符合1的条件为止

首先需要打开文件目录流,命令行输入man -k open | grep dir找到了符合条件的函数:opendir。

f84e9983603dc581a2ca38a76a707a1c.png

然后需要读取目录的信息,输入man -k read | grep dir,找到符合条件的函数:readdir

c2fca0428473768b1ae4e80dfe44ab22.png

结束需要关闭文件目录流man -k close | grep dir,找到符合条件的函数:closedir

e78a6638d688552bdad5c84eb155188a.png

通过man opendir,man readdir,man closedir等得知各个函数所需的头文件以及函数参数

49a7a88d7d7059ea9f648df1392db3d6.png

3341a6dd2b5c52bd703ba3a080b6ba0c.png

对于读取文件目录流涉及到一个结构体:

b90ddbefb312461b7481c40b614f01ea.png

struct dirent{

ino_t d_ino;//文件结点号

off_t d_off;

unsigned short d_reclen;

unsigined char d_type;

char d_name[256];//文件名

}

最重要的一点是要进入到上级目录中去,所以我man -k dir | change,没有查处结果,我就直接man -k dir,找到如下结果:

d466c863bfc4d13cf2a2801890f4054d.png

所以根据以上内容编写代码:(函数模块)

ino_t get_inode(char* fname) //根据文件名,返回-i节点

void inode_to_name(ino_t inode_to_find,char* namebuf,int buflen) //找到i-节点对应的文件名,并放在字符数组里

void printpathto(ino_t this_inode)//如果不是根目录进入上级结点,并将文件夹名存入数组,否则直接打印

实验截图:

4db42d2c187dc63a753a5bd0c6b55686.png

遇到的错误

当我将返回文件结点号的函数设计成如下时:

ino_t get_inode(char* fname) //根据文件名,返回-i节点

{

DIR *dir;

struct dirent *pdir;

dir = opendir(fname);

if (dir == NULL)

{

perror(".");

exit(1);

}

while((pdir = readdir(dir)) != NULL)

{

if(pdir->d_name == fname)

{

return pdir -> d_ino;

}

}

}

最后的结果显示为空:

19c1af1f400f6ed0d9d163ee668e394c.png

没能找到出错的原因,我将每次读取的文件名打印出来,也没发现有错误存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值