2017-2018-1 20155306 mypwd的实现

一.pwd的使用

  • 功能:

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径。
  • 命令格式:pwd [选项]
  • 命令参数
  1. -L:当目录为连接路径时,显示连接路径
  1. -P:显示实际物理路径,而非使用连接(link)路径
  • 参数使用示例

    1.:用 pwd 命令查看默认工作目录的完整路径
  1. [root@localhost ~]# pwd

2.:使用 pwd 命令查看指定文件夹

  1. [root@localhost ~]# cd /opt/soft/
  2. [root@localhost soft]# pwd
  3. /opt/soft

3.:显示当前目录的物理路径 pwd –P

  1. [root@DB-Server init.d]# cd /etc/init.d
  2. [root@DB-Server init.d]# pwd -P
  3. /etc/rc.d/init.d

4.:显示当前目录的连接路径:pwd -L

  1. [root@DB-Server networking]#cd/etc/init.d
  2. [root@DB-Server init.d]# pwd -L
  3. /etc/init.d
  4. [root@DB-Server init.d]# pwd
  5. /etc/init.d

注意:若当前目录被删除了,pwd命令仍然显示那个目录

二.pwd的实现

1. 实现要求

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

2.:实现步骤

  • 首先,我们了解到:目录其实也是一种文件,只不过这种文件比较特殊,它里面存储的是一张对应表,即文件名和i节点的对应关系表,而i节点才是记录此文件详细信息的结构,如文件大小,属性,权限,存在硬盘的那个块等。我们在一个目录创建文件就是在这张表里添加对应关系而已,使用某个文件时也是根据i节点确定在硬盘的实际存储位置的。

-然后, 有两个特殊的文件名“.” 和 “..”,“.”代表当前目录自身,".."代表包含当前目录的上一级目录。

  • 最后我们考虑如何实现:每个目录都设置了一个指向自己的i节点入口,即".",还有一个指向其父目录i节点的入口,即”..",我们首先获取当前目录的i节点编号,但是并不能知道当前目录的名称,我们切换到其的父目录,在里面寻找当前i节点编号对应的文件名即可。这样我们就很容易联想到使用递归来实现,但是终止条件是什么呢?在Unix文件系统的根目录中,“."和“..”指向同一个i节点,我们可以以此判断是否发到达了根目录。(上课老师讲过)

    -同时,我们可以通过man命令和grep命令来获取我们所需要的系统调用函数信息。

    man pwd:



    man chdir:



    man -k XX | grep XX

伪代码:


  1. {
  2. getinode(".");获取当前目录节点
  3. getinode(".."); 获取父目录节点
  4. 记录当前节点的目录名;
  5. 只有当inode == up_inode时,打印。
  6. }

产品代码:

  1. #include<stdio.h>
  2. #include<sys/stat.h>
  3. #include<dirent.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6. #include<sys/types.h>
  7. void printpath();
  8. char *inode_to_name(int);
  9. int getinode(char *);
  10. int main()
  11. {
  12. printpath();
  13. putchar('\n');
  14. return ;
  15. }
  16. void printpath()
  17. {
  18. int inode,up_inode;
  19. char *str;
  20. inode = getinode(".");
  21. up_inode = getinode("..");
  22. chdir("..");
  23. str = inode_to_name(inode);
  24. if(inode == up_inode) {
  25. // printf("/%s",str);
  26. return;
  27. }
  28. printpath();
  29. printf("/%s",str);
  30. }
  31. int getinode(char *str)
  32. {
  33. struct stat st;
  34. if(stat(str,&st) == -1){
  35. perror(str);
  36. exit(-1);
  37. }
  38. return st.st_ino;
  39. }
  40. char *inode_to_name(int inode)
  41. {
  42. char *str;
  43. DIR *dirp;
  44. struct dirent *dirt;
  45. if((dirp = opendir(".")) == NULL){
  46. perror(".");
  47. exit(-1);
  48. }
  49. while((dirt = readdir(dirp)) != NULL)
  50. {
  51. if(dirt->d_ino == inode){
  52. str = (char *)malloc(strlen(dirt->d_name)*sizeof(char));
  53. strcpy(str,dirt->d_name);
  54. return str;
  55. }
  56. }
  57. perror(".");
  58. exit(-1);
  59. }

测试结果:

2017-2018-1 20155306 mypwd的实现的更多相关文章

  1. MyEclips 2017/2018 (mac 版)安装与破解

    MyEclips 2017/2018 (mac 版)安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEclips ...

  2. MyEclipse 2017/2018 安装与破解 图文教程

    SSM 框架-02-MyEclipse 2017/2018 安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEc ...

  3. </2017><2018>

    >>> Blog 随笔原始文档及源代码 -> github: https://github.com/StackLike/Python_Note >>> 统计信 ...

  4. 我的2017&2018

    最近项目进入验收阶段,所以上班没那么忙碌了,但是怎么说呢,我可能天生是闲不住的主,觉得浑身不自在(我这样的人是不是特别不会享福),此处应该有个笑脸哈. 翻看了博客园好几个大牛写的技术文章,感慨大牛不愧 ...

  5. [2017 - 2018 ACL] 对话系统论文研究点整理

    (论文编号及摘要见 [2017 ACL] 对话系统. [2018 ACL Long] 对话系统. 论文标题[]中最后的数字表示截止2019.1.21 google被引次数) 1. Domain Ada ...

  6. CorelDRAW X7 X8 2017 2018是什么关系?

    从CorelDRAW 2017版本开始我们叫习惯了的X几系列的CorelDRAW毅然决然的就换了称呼,所以有时候很多朋友对于软件版本,经常会傻傻分不清,还有人认为X8版本比2017版本高,究竟为什么会 ...

  7. JetBrains 2017/2018全系列产品激活工具

    可谓是工欲善其事,必先利其器,相信作为优秀开发工程师的你都想拥有一套快捷高效的编码工具,而JetBrains这家公司的产品,不管是那种编程语言,其开发工具确实让开发者们着迷,JetBrains的产品博 ...

  8. 【LOJ】#2349. 「JOI 2017/2018 决赛」团子制作

    题解 有意思的一个dp,我们对G计数,发现如果不在同一条对角线上的G肯定不会互相影响,所以我们对于每一条对角线dp dp的方式是枚举这个G以什么方式放,横着还是竖着,还是不放 代码 #include ...

  9. 【LOJ】#2350. 「JOI 2017/2018 决赛」月票购买

    题解 首先求一个最短路图出来,最短路图就是这条边在最短路上就保留,否则就不保留,注意最短路图是一个有向图,一条边被保留的条件是 dis(S,u) + val(u,v) = dis(v,T)我们需要求两 ...

随机推荐

  1. tp5怎么实现搜索分页能保留搜索条件

    $profit=Db::view('profit','settlement_time,money,balance_account,balance_account1,did,user') ->vi ...

  2. CSS3盒子模型

    web前端必须了解的CSS3盒子模型 1.需要了解的属性以及属性值 display:box或者display:inline-box box-orient:horizontal | vertical ( ...

  3. 自己用的reset.css,大部分转载,加上自己常用的设置

    @charset "UTF-8";/*KISSY CSS Reset理念:清除和重置是紧密不可分的特色:1.适应中文 2.基于最新主流浏览器维护:玉伯(lifesinger@gma ...

  4. 学IT应该看些书?

    第一阶段:<数据结构><数据库><算法><信息系统管理><互联网>第二阶段:<莫生气><佛经><老子>& ...

  5. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  6. 金三银四,2018最新iOS面试题,由它可以搞定面试官?

    序言 这些资料,你一定会用到!我相信很多人都在说,iOS行业不好了,iOS现在行情越来越难了,失业的人比找工作的人还要多.失业即相当于转行,跳槽即相当于降低自己的身价.那么做iOS开发的你,你是否在时 ...

  7. 【Webpack的使用指南 01】Webpack入门

    使用Webpack有一段时间了,但是感觉之前学的用的都比较零散,所以在这里整理一下Webpack的使用知识,从入门到进阶. 创建项目 首先创建最简单的一个项目 npm init 得到以下项目结构: 安 ...

  8. JBox使用详解

    插件说明 - jBox 是一款基于 jQuery 的多功能对话框插件,能够实现网站的整体风格效果,给用户一个新的视觉享受. 运行环境 - 兼容 IE6+.Firefox.Chrome.Safari.O ...

  9. python—day02

    python的版本与基本类型... 第一: 讲了计算机的基础的补充,讲解了什么是操作系统,计算机硬件,应用程序之间的关系: 操作系统是一个能协调管理计算机软件与硬件的软件程序: 能帮我们发送指令集到C ...

  10. java基本语法特殊点

    一.关系运算符 instanceof(类型比较运算符) example:a instanceof hello // hello是一个class ==与!=可以用于引用相等运算符( 二.数组 (数组是对 ...