2018-2019-1 20165201 实现mypwd

Posted cbmwtsl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-2019-1 20165201 实现mypwd相关的知识,希望对你有一定的参考价值。

2018-2019-1 20165201 实现mypwd


实验要求

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

了解pwd命令

??pwd是"Print Working Directory"的缩写,它的功能是显示当前工作目录的绝对路径。用于在用户不确定当前所在位置的时候,通过pwd命令来查看当前目录的绝对路径。

利用man -k key学习pwd命令

先在终端中输入man -k pwd
技术分享图片
然后根据上面的提示,输入man pwd 1
技术分享图片

参数

-L:(logical)显示当前的路径,有连接文件时,直接显示连接文件的路径,(不加参数时默认此方式)

-p:(physical)显示当前的路径(物理路径),有连接文件时,不使用连接路径,直接显示连接文件所指向的文件

如何实现pwd

??之前曾经学过,在Linux中,一切皆文件,也就是说目录其实也是一种文件,只不过这种文件相对比较特殊,它里面储存的是对应表,就是文件名和iNode的对应关系表,而iNode才是记录此文件详细信息的结构,如文件大小,属性,权限等等。我们在一个目录创建文件就是在这张表里添加对应关系,使用某个文件时也是根据iNode确定在硬盘的实际存储位置的。
??现在我们使用ls -iaR命令尝试查看文件的iNode信息:
技术分享图片

??每个目录都有一个指向自己的iNode的入口,也就是”.“,还有一个指向其父目录iNode的入口,即”..“,从图中我们可以看到,每个目录下都有“.”和“..”
技术分享图片

??那么我们首先获取当前目录的iNode编号(在上上张图中,当前目录的iNode编号是8612879607),但是我们此时并不能知道当前目录的名称,我们切换到其的父目录,在里面寻找当前iNode编号对应的文件名即可。这样我们就可以使用递归来实现,终止条件是:在根目录中下,“."和“..”指向同一个iNode,即“."和“..”的iNode值相同!

代码运行结果

技术分享图片

代码

//
//  main.c
//  pwd
//
//  Created by shadow on 2018/11/26.
//  Copyright ? 2018 shadow. All rights reserved.
//

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.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("
");
    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)] = ‘‘;
            closedir(dir_ptr);
            return ;
        }
    }
    fprintf(stderr, "error looking for inode number %d
", (int)inode_num);
    exit(1);
}









以上是关于2018-2019-1 20165201 实现mypwd的主要内容,如果未能解决你的问题,请参考以下文章

2018-2019-1 20165201 20165203 20165206 实验二 固件程序设计

2018-2019-1 20165201 20165203 20165206 实验二 固件程序设计

2018-2019-1 20165201 《信息安全系统设计基础》第1周学习总结

2018-2019-1 20165201 《信息安全系统设计基础》第6周学习总结

2018-2019-1 20165201 《信息安全系统设计基础》第8周学习总结

20165201 课下作业第十周(选做)