第9周 实现PWD命令

码云链接:https://gitee.com/bestiisjava2017/laura5332/blob/master/信息安全系统设计/mybash.c

题目要求

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

学习pwd命令

  • 1:用man pwd 查看帮助文档

  • 2:显示当前目录所在路径 pwd

smile@ubuntu:~/dky5332$ pwd

/home/smile/dky5332

  • 3:显示当前目录的物理路径 pwd –P
  • 4: 显示当前目录的连接路径:pwd -L

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

man-k directory | grep 2

算法核心——伪代码

  1. 拿到当前目录中"."这个目录的st_ino值,记为inode。
  2. 转到父目录中,遍历父目录,找到第一个st_ino值与inode相同的那个目录,并保存名字。
  3. 再拿当前目录中"."目录的st_ino值作为inode,向前递归(此时的"."目录已经不是1中的"."了,而是1中的"..")
  4. 输出 “/" + 2中保存的名字

递归出口:

由于在根目录下,"." 和 ".." 的inode值是一样的,所以当递归到某一层,若父目录的inode值与当前的inode值(作为递归函数的参数传入) 相同,那么就可以结束递归了。

3.实现pwd命令

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.h>
#include<stdlib.h>
#include<string.h> #define SIZE 128 ino_t get_inode(char *dirname);
void get_work_dir(ino_t inode_num);
void inode_to_dirname(ino_t inode_num, char *buf, int buflen); int main(void)
{
get_work_dir(get_inode("."));
printf("\n");
return 0; } ino_t get_inode(char *dirname)
{
struct stat info;
if (stat(dirname, &info) == -1)
{
perror("dirname");
exit(1);
} return info.st_ino;
} void get_work_dir(ino_t inode_num)
{
ino_t parent_inode;
char buf[SIZE];
if (get_inode("..") != inode_num)
{
chdir("..");
inode_to_dirname(inode_num, buf, SIZE);
parent_inode = get_inode(".");
get_work_dir(parent_inode);
printf("/%s", buf);
}
} void inode_to_dirname(ino_t inode_num, char *buf,int buflen)
{
DIR *dir_ptr;
struct dirent *dire;
if ((dir_ptr = opendir(".")) == NULL)
{
perror(".");
exit(1);
} while ((dire = readdir(dir_ptr)) != NULL)
{
if (dire->d_ino == inode_num)
{
strncpy(buf, dire->d_name, buflen);
buf[strlen(buf)] = '\0';
closedir(dir_ptr);
return ;
}
}
fprintf(stderr, "error looking for inode number %d\n", (int)inode_num);
exit(1);
}

测试pwd命令



第9周 实现PWD命令的更多相关文章

  1. 2017-2018-1 20155215 第九周 加分项 PWD命令的实现

    1 学习pwd命令 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pw ...

  2. 20155322 2017-2018-1《信息安全系统设计》第九周 Linux命令:pwd命令学习与简单实现

    pwd命令学习 功能 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 格式 pwd [选项] 实例 用 pwd 命令查看默认工作目录的完整路径: 用 pwd 命令查 ...

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

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

  4. pwd命令

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

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

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

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

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

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

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

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

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

  9. 每天一个Linux命令(3):pwd命令

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

随机推荐

  1. scala基础入门

    1.scala当中申明值和变量 scala当中的变量申明可以使用两种方式,第一种使用val来申明变量.第二种使用var来申明变量. 申明变量语法 val/var 变量名 [:变量类型] = 变量值 其 ...

  2. Zookeeper学习之路 (三)shell操作

    Zookeeper的shell操作 Zookeeper命令工具 在启动Zookeeper服务之后,输入以下命令,连接到Zookeeper服务: [hadoop@hadoop1 ~]$ zkCli.sh ...

  3. 组合测试(Combinatorial Test)/配对测试 (pairwise)

    组合测试方法:配对测试实践 实施组合测试 常用的Pairwise工具集:http://www.pairwise.org/tools.asp 成对测试(Pairwise Testing)又称结对测试.两 ...

  4. 新闻cms管理系统 (补)-----路由优化一

    修改后台的入口文件,将访问后台页面的入口文件设为admin.php,并且访问该文件的模块默认为admin模块. 添加后台入口文件具体操作步骤: (1)项目目录下新建admin.php (2)实现入口文 ...

  5. Spring@PostConstruct注解和构造方法的调用顺序

    先看下@PostConstruct的注解 * The PostConstruct annotation is used on a method that needs to be executed * ...

  6. .Net Core应用程序发布时不同方式的差别

    .Net Core的文档更新的真是快..每次看的时候都觉得之前是不是梦游看的...每次发布应用程序的时候都要翻看下文档..至少rid是死活记不住.还是留个RID的索引吧..还有发布的索引 ,这样就好复 ...

  7. 编译nginx错误:make[1]: *** [/pcre//Makefile] Error 127

    --with-pcre=DIR 是设置源码目录,而不是编译安装后的目录.

  8. Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:

    原文:https://blog.csdn.net/tianlesoftware/article/details/5826546 Nested Loops,Hash Join 和 Sort Merge ...

  9. Xcode引入了第三方的类库之后真机调试提示莫名其妙的错误

    其中的解决方法就是修改Build Setting里面的Build Active Architecture Only(仅仅编译动态代码),将这个里面的值修改为YES即可.

  10. [iOS]UIInterpolatingMotionEffect重力视觉差

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...