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

    码云链接

  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/dky20155212/p/7862211.html
Copyright © 2011-2022 走看看