博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现mypwd
阅读量:6657 次
发布时间:2019-06-25

本文共 1970 字,大约阅读时间需要 6 分钟。

- 实现mypwd

- 任务要求:

1 学习pwd命令

2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
3 实现mypwd
4 测试mypwd

提交过程博客的链接

- 实现过程:

- 学习pwd命令

  • 功能:查看”当前工作目录“的完整路径

  • 命令格式:pwd

  • 使用man命令查看pwd

    1296608-20181123212206241-356642225.png

1296608-20181123212212768-599913722.png

  • 实现pwd
    1296608-20181123212223952-354729245.png

- 研究pwd实现需要的系统调用(man -k; grep),写出伪代码

  • man -k directory|grep 2

因为pwd是查看当前工作目录的路径,因此应该查找有关目录的有关信息,即directory。使用命令

man -k directory|grep 2 查找,可发现getcwd的功能是“得到当前工作目录”。符合要求,通过man命令查看其帮助文档。
1296608-20181123212244180-581500795.png

  • man getcwd

1296608-20181123212351615-308547199.png

1296608-20181123212359233-249288659.png

这里可发现getcwd的工作原理:这些函数返回一个以空结尾的字符串,该字符串包含一个绝对路径名,该路径名是调用进程的当前工作目录。路径名作为函数结果返回,如果存在,则通过参数BUF返回。

我们需要的就是这个参数BUF,而BUF是一个定义的指针,所以可据此写伪代码。

  • 伪代码
定义一个字符串数组,用于存放绝对路径;定义一个指针BUF;getcwd();if(BUF)打印存放的路径名;else出错;

- 实现mypwd

  • int getinode(char *);

    该函数功能是显示当前目录的inode。功能实现是调用了stat,stat用于显示文件或文件系统的详细信息。此处返回当前目录的inode。

  • char *inode_to_name(int);

    该函数功能是存储绝对路径。功能实现是调用了dir、dirent、opendir、readdir等,将每一次获取的文件夹目录内容进行复制,存储并返回。

  • void printpath();

    该函数功能是打印路径。功能实现是调用了getinode函数和inode_to_name函数,即从当前目录开始,不断返回上一层目录,比较当前目录与上一层目录的inode是否相同,若相同则表明返回到了根目录,然后将指针中存储的路径返回并打印。

  • mypwd代码:

#include
#include
#include
#include
#include
#include
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) { 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); }

- 测试mypwd

1296608-20181123212424564-545931020.png

- 体会

这次是利用c语言实现pwd命令,思路还算比较清晰,但在编写代码上还是存在困难,我学习并借鉴了网上的代码,实现了mypwd,收获还是挺大的。

转载于:https://www.cnblogs.com/brs666/p/10009823.html

你可能感兴趣的文章
MySQL Replication可扩展设计
查看>>
oracle 对象管理 05_系统函数
查看>>
Linux下Java运行环境安装
查看>>
lua 随机生成 中国大陆 ip
查看>>
三种实现页面跳转的方法
查看>>
Fuchsia 操作系统的四层结构
查看>>
Linux 4.21包含对AMD Rome处理器中新的Zen 2架构重要的新优化
查看>>
Linux内核的缓存
查看>>
react-jianshu项目的创建
查看>>
NSCalendar取得上个月
查看>>
echarts 2.0 macarons主题安装
查看>>
OpenStack块存储nova-volume工作机制和相关问题
查看>>
【C#每日一贴】禁用承载进程----“工程名.vshost.exe”
查看>>
ThinkPHP Where 条件中使用表达式
查看>>
wxpython
查看>>
matlab常用快捷键
查看>>
js正则校验通用的文本框
查看>>
免费架构之ADF12C essentials+MYSQL5.5.40+GLASSFISH4.1
查看>>
openssl genrsa 生成私钥
查看>>
model层功能函数命名规范
查看>>