pwd的实现

任务要求:

1) 学习pwd命令

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

3) 实现mypwd

4) 测试mypwd

实现过程

1)首先查看是否有有用的命令,输入man -k directory|gerp 2

2)发现readdir好像符合我们的需求,输入man readdir查看详细资料

3)从详细资料中发现readdir符合我们的需求,这需要头文件#inlude<dirent.h>,并且readdir定义的是一个结构体,可知该函数返回一个dirent结构体指针,dirent结构体成员如下,

 struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* not an offset; see NOTES */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all filesystem types */
char d_name[256]; /* filename */
};

根据老师课上的内容可以知道,linux中,文件查找不是通过文件名称来查找的。实际上是通过i节点来实现文件的查找定位的。根据在实现mypwd的过程中,我们需要用到文件的i节点,i节点跟文件的关系如下图

因此需要用到该返回值结构体中的ino_t型的d_ino,通过该返回值来打开我们所需要的文件,此外由于根节点的节点值与其父节点的节点值是一样的,因此可以通过这个条件来进行循环。

伪代码:

while(1)
{
获取当前目录的i节点值ci;
获取父级目录的i节点值pi;
if(ci==pi)判断是否到达根节点;
break;
else
打开至父级目录,根据获取的i节点值,在父级目录中搜索对应的文件名并记录下来;
输出文件名则为绝对路径; }
4)在读一个路径之前,我们需要打开这个路径,这就需要用到opendir函数,这个函数的原型是DIR *opendir(const char *name),需要的头文件是#include <sys/types.h> 和#include <dirent.h>
![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230537515-1576166726.png) 5)除此之外,我们还需要知道文件的信息,这就要用到state,所需要的头文件是#include <sys/stat.h> #include <unistd.h>,使用ino_t来获取文件的节点 6)在查询到了当前文件夹名称后,需要返回父目录,重复此操作,这就需要用到chdir函数,他可以改变当前路径
![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230544999-198471059.png) 7)之后就是不断地读取当前目录,并和父目录名称比对,如果当前目录和父目录的名称一致则跳出循环
## 完成结果 ![](http://images2017.cnblogs.com/blog/1072918/201711/1072918-20171118230554968-1338459308.png)

pwd的实现20155301的更多相关文章

  1. 20155301 Web基础

    20155301 Web基础 1.基础问题回答 (1)什么是表单 答: 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素 (2)浏 ...

  2. linux常用命令(2)pwd命令

    pwd 命令1 命令格式:pwd [选项]2 命令功能查看当前工作目录的完整路径3 常用参数一般不带任何参数如果目录是链接时:pwd -P 显示实际路径,而非使用链接路径4 常用实例:4.1 用pwd ...

  3. pwd命令

    [pwd]      打印当前的工作目录             pwd==print work director 命令格式: pwd [OPTION]... 命令功能: 打印当前工作目录的全路径 命 ...

  4. Linux命令学习总结:pwd命令

    命令简介: 该命令用来显示目前所在的工作目录.指令英文原义:print work directory 执行权限    :All User 指令所在路径:/usr/bin/pwd 或 /bin/pwd ...

  5. 每天一个linux命令(3):pwd命令

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  6. 【初级】linux pwd 命令详解及使用方法实战

    pwd:查看当前工作目录 前言: Linux中用 pwd 命令来查看”当前工作目录“的完整路径,就是经常提及的所在目录,多用在生产环境多级目录中查看当前所在路径,使用此命令能给运维人员/操作人员带来很 ...

  7. linux命令(3):pwd命令

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  8. linux-11 基本命令之 -工作期目录切换命令-pwd,cd,

    pwd 命令用于显示当前的工作目录,格式为:pwd[选项] @1.查看当前的工作路径: [root@localhost /]# pwd cd 命令用于切换工作路径 格式为:"cd 目录名称& ...

  9. Linux2:vi、ls、cd、pwd、mkdir、rm、mv、cp、cat、tail

    前言 从本篇文章开始,每篇文章将写10个Linux命令,个人的写作想法是: 1.常用的Linux命令,那些生僻的.不常用的就不写了 2.从实际考虑,只列出每个命令常见的用法和参数选项,有兴趣了解进一步 ...

随机推荐

  1. 原生java调用webservice的方法,不用生成客户端代码

    原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...

  2. swift版的CircleView

    swift版的CircleView 效果图 源码 // // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/ ...

  3. spring-boot-jpa 自定义查询工具类

    1.pom文件中添加如下配置 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  4. 一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用

    一.DAO设计模式概述###<1>概念 DAO,Data Access Object ,用于访问数据库的对象. 位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问![](1.png) ...

  5. TeamViewer app案例分析

    产品 产品名 TeamViewer远程app 选择原因 远程连接软件是不时之需,当有时私人电脑没有在身边而又需要操作电脑时,远程控制TeamViewer这个软件能帮我们大忙. 调研与评测 1.第一次上 ...

  6. 【笔记】JS脚本为什么要放在body最后面以及async和defer的异同点

    1.没有defer或async 浏览器遇到脚本的时候会暂停渲染并立即加载执行脚本(外部脚本),"立即"指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的 ...

  7. QT5.8连接Mysql提示QMYSQL driver not loaded

    我们都知道在QT5.8系列里已经带了Mysql的dll文件 驱动的名字为“qsqlmysql.dll”和“qsqlmysqld.dll” 但是按照网上的各种教程和博客基本都是错的,只有个别人是对的. ...

  8. MDRT_<>$表

    数据库中有好多的MDRT打头的表,而这些表的字段都是一样的,那这些表是做什么用呢? MDRT_<>$: 用来存储与空间索引相关的信息.这些表与常规表不一样,不能做复制,删除,新建等.如果对 ...

  9. AOP-通知-笔记

    说到AOP肯定会想到切面.通知.切点等等.那什么是通知呢?之前我一直以为我们所说的通知就是我们写在切面中的方法,但是随着AOP认识的加深,现在发现所谓的通知不仅仅是我们写在切面中的方法,通知方法只是通 ...

  10. php魔术变量

    __LINE__   文件中的当前行号 __FILE__ 文件的完整路径和文件名 __DIR__  文件所在的目录 __FUNCTION__  自 PHP 5 起本常量返回该函数被定义时的名字 __C ...