zoukankan      html  css  js  c++  java
  • 20155212 C语言实现linux下pwd命令的两种方法

    20155212 C语言实现linux下pwd命令的两种方法

    学习pwd命令

    • 通过man pwd命令查看
    • pwd [OPTION],一般不加参数
      • -P显示当前目录的物理路径
      • -L显示当前目录的连接路径
    • 该命令用来显示目前所在的工作目录。指令英文原义:print work directory

    系统调用

    • 使用man -k dir | grep 2命令查看有哪些跟pwd相关的系统调用
    • 这里有两个系统调用可能用到pwd中
      • getcwd()
        • 功能:获取当前目录
        • 参数
          • char *buf:存储当前路径的字符串
          • size_t size:buf的空间大小
        • 返回值: 成功则返回指向当前路径字符串的指针,错误则返回NULL
      • readdir()
        • 功能:readdir()返回参数dir目录流的下个目录进入点
        • 参数:DIR * dir。结构dirent定义如下:
          struct dirent{
              ino_t d_ino;//此目录进入点的inode
              off_t d_off;//目录文件开头至此目录进入点的位移
              unsigned short int d_reclen;//记录的长度
              unsigned char d_type;//文件类型
              char d_name[256];
          };
          
        • 返回值:成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL
    • 但是发现readdir()不能单独使用,
      • opendir()
        • 功能:opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值
        • 参数:路径名
        • 返回值:成功则返回DIR* 型态的目录流,打开失败则返回NULL。
      • chdir()
        • 功能:切换当前目录
        • 参数:路径名

    伪代码

    • 使用getcwd()
    定义数组buf[MAXPATH];
    调用getcwd(buf, MAXPATH);
    输出返回值;
    
    • 使用readdir()
    while(1)
    {
        读取"."和".."的信息
        if("."的inode==".."的inode)
        {
            退出;
        }
        else
        {
            chdir("..");
            while(dirent->inode!=前面"."的inode)
            {
                dirent=readdir();
            }
            dirent->name入栈;
        }
    }
    for 栈顶->栈底
        print 栈顶信息
    

    产品代码

    • 使用getcwd()
    #include <stdio.h>
    #include <unistd.h>
    #define MAXPATH 50
    
    int main()
    {
        char path[MAXPATH];
        puts(getcwd(path, MAXPATH));
        return 0;
    }
    
    
    • 使用readdir()
    #include <stdio.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
    
    int main()
    {
    
        DIR *dirptr=NULL;
        struct dirent *current_dirent=NULL, *parent_dirent=NULL, *tmp_dirent=NULL;
        int count=0;
        ino_t current_inode;
        char path[256][256];
    
        while(1)
        {
            dirptr=opendir(".");
            do
            {
                current_dirent=readdir(dirptr);
            }while(strcmp(current_dirent->d_name, ".")!=0);
            current_inode=current_dirent->d_ino;
            closedir(dirptr);
            dirptr=opendir(".");
            do
            {
                parent_dirent=readdir(dirptr);
            }while(strcmp(parent_dirent->d_name, "..")!=0);
            closedir(dirptr);
            if(((long)parent_dirent->d_ino)==((long)current_dirent->d_ino))
            {
                break;
            }
            else
            {
                chdir("..");
                dirptr=opendir(".");
                do
                {
                    tmp_dirent=readdir(dirptr);
                }while(tmp_dirent->d_ino!=current_inode);
                closedir(dirptr);
                count++;
                strcpy(path[count], tmp_dirent->d_name);
            }
        }
        int i;
        for(i=count;i>0;i--)
        {
            printf("/%s", path[i]);
        }
    	printf("
    ");
    
        return 0;
    }
    

    测试

    • 实现一:使用getcwd()实现pwd
    • 实现二:使用readdir()实现pwd

    码云链接

  • 相关阅读:
    keras_12_keras自带的Applications
    keras_11_keras中示例数据集
    keras_10_回调函数 Callbacks
    Runloop
    SDWebImage
    NSOperation
    单例模式
    GCD
    一文读懂汉明码
    聊聊SPOOLing技术
  • 原文地址:https://www.cnblogs.com/dky20155212/p/7862211.html
Copyright © 2011-2022 走看看