20165235 实现pwd功能

要求

  1. 学习pwd命令

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

    3.实现mypwd
  2. 测试mypwd

实现过程

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

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

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

    -根据以上信息编写代码:
#include<stdio.h>
#include<unistd.h>
int main(){
char a[100];
getwd(a);
printf("%s\n",a);
return 0;
}
  • 编译代码并且运行,结果如下:



    但是发现以上代码过于简单,是否有一种方法是可以通过操作目录文件来进行实现pwd功能。所以有以下伪代码:
1.打开文件目录查看所有目录如果查到当前目录中有两个相同的" ."文件说明已经到了文件根目录,也就是说本目录的i-node与上级目录的i-node相同。
2.否则进入".."文件目录,并且将上一级件目录名记录添加到数组中
3.直到符合1的条件为止
  • 首先需要打开文件目录流,命令行输入man -k open | grep dir找到了符合条件的函数:opendir。

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

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

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



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

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,找到如下结果:

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

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)//如果不是根目录进入上级结点,并将文件夹名存入数组,否则直接打印

实验截图:

实验代码链接

遇到的错误

  • 当我将返回文件结点号的函数设计成如下时:
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;
}
} }

最后的结果显示为空:

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

20165235 实现pwd功能的更多相关文章

  1. linux笔记:目录处理命令ls,mkdir,cd,pwd,rmdir,cp,mv,rm

    linux命令的格式:命令 [-选项] [参数]例:ls -la /etc 命令:ls命令所在路径:/bin/ls功能:显示目录文件用法:ls [-aldh] []参数:-a 查看所有文件,包括隐藏文 ...

  2. 2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现

    2017-2018-1 20155201 <信息安全系统设计基础> pwd命令的实现 一.对pwd命令的学习 在终端中输入man pwd查看手册中对pwd这一命令的解释: 以绝对路径的方式 ...

  3. Linux文件系统命令 pwd

    命令名:pwd 功能:查看当前所处的位置 eg: renjg@renjg-HP-Compaq-Pro--MT:~$ pwd /home/renjg renjg@renjg-HP-Compaq-Pro- ...

  4. 2018-2019-1 20165212 《信息安全系统设计基础》第八周学习总结(pwd)

    2018-2019-1 20165212 <信息安全系统设计基础>第八周学习总结 一.知识点总结 1.三种并发方式 构造并发程序的方法有三种: 进程 线程 I/O多路复用 进程:用内核来调 ...

  5. pwd命令学习

    pwd命令学习 1.学习pwd命令 pwd命令功能为输出当前所在工作目录的绝对路径名称. 绝对路径和相对路径: 绝对路径:从根目录开始直到文件位置 相对路径:相对于程序当前所在目录到文件位置 例:程序 ...

  6. SQLALchemy(连表)、paramiko

    本节内容:

  7. Linux笔记-常用的命令(15-3-30)

    vim命令参考: http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html [1]解压文件格式的区别: *.tar  ...

  8. Linux命令自己总结

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  9. Linux常用命令总结——文件管理

    Linux中的目录 路径:也就是linux中的目录(文件夹)有绝对路径和相对路径 根目录:/ 用户主目录(home directory):位于/home目录下,用户登录时 工作目录(working d ...

随机推荐

  1. python 内置函数详解

    懒得写了  参考1:https://www.cnblogs.com/xiao1/p/5856890.html 参考2:https://www.runoob.com/python/python-buil ...

  2. jmeter 多个sql写在一个jdbc请求中注意事项

    在url里面加上?allowMultiQueries=true 类型选callableStatement

  3. jQuery使用():Callbacks回调函数列表之异步编程(含源码分析)

    Callbacks的基本功能回调函数缓存与调用 特定需求模式的Callbacks Callbacks的模拟源码 一.Callbacks的基本功能回调函数缓存与调用 Callbacks即回调函数集合,在 ...

  4. 用户认证授权和Shiro入门

    1.权限管理基础(认证和授权): 前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习S ...

  5. [译]Ocelot - Caching

    原文 Ocelot支持基本的缓存,目前Ocelot的缓存是通过CacheManager project实现的. 下面的示例展示了如何启用缓存: s.AddOcelot() .AddCacheManag ...

  6. sqlyog连接mysql8.0

    1.本人安装的是mysql8.0社区版,安装包名称:mysql-installer-community-8.0.12.0.msi,可自行到官网下载. 2.安装完成后用sqlyog连接数据库出现密码乱码 ...

  7. P5284 [十二省联考2019]字符串问题

    这是一道涵盖了字符串.图论.数据结构三个方面的综合大题. 把这道题放在D1T2的人应该拖出去打 前置芝士 首先,您至少要会topsort. 其次,如果您只想拿个暴力分,字符串Hash就足够了:如果您想 ...

  8. 机器学习基石7-The VC Dimension

    注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 前几节课着重介绍了机器能够学习的条件并做了详细的推导和解释.机器能够学习必须满 ...

  9. 微信小程序开发学习(二)

    一些官方API 总结了一些官方API,便于之后有用时针对性查找(发现官方给了好多好用的API)官方API文档 基础 wx.canIUse:判断小程序的API,回调,参数,组件等是否在当前版本可用,返回 ...

  10. 课堂小练习 设计、定义并实现Complex类

    定义一个负数类Complex使得下面的代码能够工作.(课本P145) #include<iostream> #include<cmath> using namespace st ...