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

学习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("
");
    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] = '';
            closedir(cdir);
            return;
        }
    }
    printf("error looking for inode
");
}

ino_t get_inode(char* fname)            //根据文件名,返回-i节点
{
    struct stat info;
    stat( fname, &info);
    return info.st_ino;
}

测试mypwd

原文地址:https://www.cnblogs.com/-zyl/p/7860148.html