学习pwd命令

  • man pwd查看

  • pwd命令用于显示当前工作目录,是Linux下最常用的命令之一。在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。
  • 环境变量OLDPWD表示前一次的工作目录,环境变量PWD表示当前的工作目录。
  • 目录连接链接时,pwd -P 显示出实际路径,而非使用连接(link)路径;pwd显示的是连接路径
  • /bin/pwd
    • -L 目录连接链接时,输出连接路径
    • -P 输出物理路径

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

实现pwd有两种函数,一个是getcwd(),一个是多个函数嵌套。

  • getcwd()即得到当前工作目录,调用这个函数,返回值就是当前目录。
  • 使用系统调用函数,包括readdirchdir

原始伪代码

使用循环不断进入上级目录,读取目录名

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的更多相关文章

  1. 2017-2018-1 20155330 《信息安全系统设计基础》加分项目--实现mypwd

    2017-2018-1 20155330 <信息安全系统设计基础>加分项目--实现mypwd pwd命令 命令功能:查看"当前工作目录"的完整路径. 通过man命令查看 ...

  2. 2017-2018-1 20155336 《信息安全系统设计基础》加分作业:实现mypwd

    2017-2018-1 20155336 <信息安全系统设计基础>加分作业:实现mypwd 什么是PWD? 用man pwd查看: 用于打印当前工作目录的工作路径 1.命令格式:pwd[选 ...

  3. 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)

    2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...

  4. 20155305《信息安全系统设计基础》10月18日课堂 fork,exic,wait

    20155305<信息安全系统设计基础>10月18日课堂 fork,exic,wait fork()函数 1.fork函数作用 一般来讲, 我们编写1个普通的c程序, 运行这个程序直到程序 ...

  5. # 20145314《信息安全系统设计基础》期中复习总结 Part B

    20145314<信息安全系统设计基础>期中复习总结 Part B 学习知识点内容总结 复习线索:http://group.cnblogs.com/topic/73069.html 本周的 ...

  6. 20145213《信息安全系统设计基础》实验一 Linux开发环境的配置

    北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号:20145213 20145222 成绩: 指导教师:娄嘉鹏 实验日期:2016 ...

  7. 20145215&20145307《信息安全系统设计基础》实验二 固件设计

    20145215&20145307<信息安全系统设计基础>实验二 固件设计 实验目的与要求 了解多线程程序设计的基本原理,学习 pthread 库函数的使用. 了解在 linux ...

  8. 20145215&20145307《信息安全系统设计基础》实验五 网络通信

    小组成员:20145215卢肖明.20145307陈俊达 实验报告链接:信息安全系统设计基础--实验五实验报告

  9. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  10. 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验

    20145216 20145330 <信息安全系统设计基础> 实验五 简单嵌入式WEB 服务器实验 实验报告封面 实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/ ...

随机推荐

  1. SuperSocket.ClientEngine介绍

    项目地址:https://github.com/kerryjiang/SuperSocket.ClientEngine 其中需要引入的SuperSocket.ProtoBase项目:SuperSock ...

  2. 【[SHOI2007]善意的投票】

    直接是最小割啊 设最终还和\(S\)相连表示睡觉,和\(T\)相连表示不睡觉 如果这个人想睡觉,那么就从源点向它连\(1\)的边,表示割掉这条边选择不睡觉的代价为1 如果这个人不想睡觉的话,就向汇点连 ...

  3. weblogic之CVE-2016-3510反序列化分析

    将反序列化的对象封装进了weblogic.corba.utils.MarshalledObject,然后再对MarshalledObject进行序列化,生成payload字节码.由于Marshalle ...

  4. QTP基本方法

    1.for循环: m代表间隔循环长度: 如果m>0,则j要大于i: 如果m<0,则i要大于j: for i to j [step m] 语句块 [exit for]//强制退出循环 nex ...

  5. Python 自动化paramiko操作linux使用shell命令,以及文件上传下载linux与windows之间的实现

    # coding=utf8 import paramiko """ /* python -m pip install paramiko python version 3. ...

  6. Dubbo实践(十四)生产者发布服务

    Export发布服务流程 Dubbo协议向注册中心发布服务:当服务提供方,向dubbo协议的注册中心发布服务的时候,是如何获取,创建注册中心的,如何注册以及订阅服务的,下面我们来分析其流程. 看如下配 ...

  7. Dubbo实践(八)扩展点装饰

    Filter Filter是Dubbo里面非常重要的模块,Dubbo里面日志记录.超时等功能都是在这一部分实现. 如上一节在介绍扩展点加载时所述,在生成Protocol的invoker时,实际上使用了 ...

  8. PAT——1033. 旧键盘打字

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在2行中分别给出坏掉的那些键.以及应该输入的文 ...

  9. Reading SBAR SDN flow-Based monitoring and Application Recognition

    概要 在sdn下,控制平面基于网络测量的的数据控制网络,而细粒度的管理得益于细粒度的测量数据.针对sdn环境下的细粒度测量(识别具体应用程序),可以实现对细粒度的流量管控. 设计了识别系统SBAR,对 ...

  10. VPP(Vector Packet Processing)配置工具

    前言 VPP提供了一个配置工具,让用户可以简单快捷地配置VPP.用户可以通过一些简单的命令配置VPP,功能包括安装及一些基本配置和测试用例. 使用 先安装一个python的pip模块,使用pip安装V ...