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

  • 相关阅读:
    【AtCoder】AtCoder Grand Contest 017 解题报告
    【洛谷2523】[HAOI2011] Problem c(DP水题)
    【洛谷1912】[NOI2009] 诗人小G(决策单调性优化DP)
    【AtCoder】AtCoder Grand Contest 018 解题报告
    【洛谷3237】[HNOI2014] 米特运输(哈希)
    【洛谷2217】[HAOI2007] 分割矩阵(DP水题)
    【洛谷1039】侦探推理(字符串模拟题)
    【AtCoder】AtCoder Grand Contest 019 解题报告
    【洛谷4965】薇尔莉特的打字机(假装有棵Trie树)
    【CF512D】Fox And Travelling(拓扑+树上背包)
  • 原文地址:https://www.cnblogs.com/L1079991001/p/12026833.html
Copyright © 2011-2022 走看看