2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd相关的知识,希望对你有一定的参考价值。
学习pwd命令
- man pwd查看
- pwd命令用于显示当前工作目录,是Linux下最常用的命令之一。在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。
- 环境变量OLDPWD表示前一次的工作目录,环境变量PWD表示当前的工作目录。
- 目录连接链接时,pwd -P 显示出实际路径,而非使用连接(link)路径;pwd显示的是连接路径
- /bin/pwd
- -L 目录连接链接时,输出连接路径
- -P 输出物理路径
研究pwd实现需要的系统调用(man -k; grep),写出伪代码
实现pwd有两种函数,一个是getcwd(),一个是多个函数嵌套。
- getcwd()即得到当前工作目录,调用这个函数,返回值就是当前目录。
- 使用系统调用函数,包括
readdir
和chdir
。
原始伪代码
使用循环不断进入上级目录,读取目录名
do{
readdir(".");
chdir("..");
}while(i_node("..")!=i_node("."));
但是在编写的过程中,发现先读取的是子目录,而要先显示的是父目录。一个解决办法是将所有读取到的目录存到数组中,从最后一个元素开始显示,但是觉得太麻烦了,改进了代码。
改进伪代码
pwd()
if(i_node("..")!=i_node("."))
{
chdir("..");
pwd("..");
printf();
}
使用递归函数,就可以直接从父目录开始显示了。
实现mypwd
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
ino_t get_inode(char*);
void pwd(ino_t);
void name(ino_t,char*,int);
int main()
{
pwd(get_inode("."));
printf("\\n");
return 0;
}
void pwd(ino_t this_inode)
{
ino_t my_inode;
char its_name[BUFSIZ];
if (get_inode("..")!=this_inode)
{
chdir("..");
name(this_inode,its_name,BUFSIZ);
my_inode = get_inode(".");
pwd(my_inode);
printf("/%s",its_name);
}
}
void name(ino_t inode,char* namebuf,int buflen) //找到i-节点对应的文件名
{
DIR* cdir;
struct dirent* direntp;
cdir = opendir(".");
while((direntp = readdir(cdir)) != NULL)
{
if(direntp->d_ino == inode)
{
strncpy(namebuf,direntp->d_name,buflen);
namebuf[buflen-1] = ‘\\0‘;
closedir(cdir);
return;
}
}
printf("error looking for inode\\n");
}
ino_t get_inode(char* fname) //根据文件名,返回-i节点
{
struct stat info;
stat( fname, &info);
return info.st_ino;
}
测试mypwd
以上是关于2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd的主要内容,如果未能解决你的问题,请参考以下文章
2017-2018-1 20155315 《信息安全系统设计基础》第11周学习总结
2017-2018-1 20155315 《信息安全系统设计基础》实验三 实时系统
2017-2018-1 20155315 《信息安全系统设计基础》实验五 通讯协议设计