zoukankan      html  css  js  c++  java
  • 实现mypwd

    C语言实现mypwd

    学习pwd命令

    搜索pwd命令的相关资料

    Linux pwd命令用于显示工作目录。

    执行pwd指令可立刻得知您目前所在的工作目录的绝对路径名称。

    pwd -P 显示当前工作目录物理路径

    pwd -L 显示当前的工作目录 / 链接逻辑路径

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

    通过man -k dir | grep get查询关于获取相关的命令。

    我们发现getcwd是获取当前目录,再通过man getwd来获取信息。

    直接调用函数即可

    #include<stdio.h>
    #include<unistd.h>
    int main(){
     char a[100];
     getwd(a);
     printf("%s
    ",a);
     return 0;
    }
    

    还可以通过操作目录文件来进行实现pwd功能

    1.打开文件目录查看所有目录如果查到当前目录中有两个相同的" ."文件说明已经到了文件根目录,也就是说本目录的i-node与上级目录的i-node相同。
    2.否则进入".."文件目录,并且将上一级件目录名记录添加到数组中
    3.直到符合1的条件为止
    

    输入man -k open | grep dir,查看打开文件目录流有关的内容

    还需要读取目录的信息 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];//文件名
    }
    

    实现mypwd

    最终代码

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    
    ino_t get_inode(char*);
    void printpathto(ino_t);
    void inode_to_name(ino_t,char*,int);
    int main()
    {
        printpathto(get_inode("."));  
        putchar('
    ');
        return 0;
    }
    
    void printpathto(ino_t this_inode)
    {
        ino_t my_inode;
        char its_name[BUFSIZ];
        if (get_inode("..")!=this_inode)                                
        {
            chdir("..");         
            inode_to_name(this_inode,its_name,BUFSIZ);
            my_inode = get_inode(".");
            printpathto(my_inode);
            printf("/%s",its_name);
        }
    }
    void inode_to_name(ino_t inode_to_find,char* namebuf,int buflen)   
    {
        DIR* dir_ptr;
        struct dirent* direntp;
        dir_ptr = opendir(".");
        if (dir_ptr == NULL)
        {
            perror(".");
            exit(1);
        }
        while((direntp = readdir(dir_ptr)) != NULL)
        {
            if(direntp->d_ino == inode_to_find)
            {
                strncpy(namebuf,direntp->d_name,buflen);
                namebuf[buflen-1] = '';
                closedir( dir_ptr);
                return;
            }
        }
        fprintf( stderr , "error looking for inum % d
    " ,inode_to_find);
        exit (1) ;
    }
    ino_t get_inode(char* fname)            
    {
        struct stat info;
        if ( stat( fname, &info) == -1){
            fprintf( stderr , "Cannot stat ");
            perror(fname);
            exit (1);
        }
        return info.st_ino;
    }
    

    测试mypwd

  • 相关阅读:
    人工智能技术导论——博弈树搜索
    人工智能技术导论——基于产生式规则的机器推理
    人工智能技术导论——基于遗传算法的随机优化搜索
    人工智能技术导论——使用PROLOG逻辑语言解决爱因斯坦斑马问题
    人工智能技术导论——逻辑程序设计语言PROLOG
    操作系统——页面调度算法
    操作系统——页式存储管理
    人工智能技术导论复习大纲
    计算机图形学复习大纲
    算法设计与分析——算法复杂性分析
  • 原文地址:https://www.cnblogs.com/L1079991001/p/12026833.html
Copyright © 2011-2022 走看看