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

  • 相关阅读:
    Bootstrap-select 动态绑定值
    Centos 下载
    设置图片大小和旋转
    aolication全局传递参数
    Activity静态变量传递参数
    Activity传递参数
    Activity横屏后声明周期的变化
    Intent隐式意图
    Intent显示意图的四种跳转
    SharedPreferences简单的应用
  • 原文地址:https://www.cnblogs.com/L1079991001/p/12026833.html
Copyright © 2011-2022 走看看