• 实现mypwd


    实现mypwd

    要求:

    1. 学习pwd命令
    2. 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
    3. 实现mypwd
    4. 测试mypwd

    1、pwd?

    pwd 代表的是打印当前目录Print Working Directory,它会打印出以根目录为起点的完整目录名即为绝对目录。这条命令是一条shell内建命令,并且在大多数shell中都可以使用,如bashBourne shellkshzsh等。
    ** pwd 通常不带选项运行,且没有任何参数**

    2、研究pwd实现所需要的系统调用

    使用命令man -k directory | grep 2则可以寻找实现打印当前目录的系统调用函数

    3、代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <string.h>
    #include <unistd.h>
    
    #define MAX_DIR_DEPTH (256)  //限制最大的目录深度  
    #define TRUE 1
    #define FALSE 0
    
    //根据文件名获取文件的inode-number
    ino_t get_ino_byname(char *filename)
    {
        struct stat file_stat;
        if(0 != stat(filename, &file_stat)) //stat()通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
        {
            perror("stat");
            exit(-1);
        }
    
        return file_stat.st_ino;
    }
    
    //根据inode-number, 在当前目录中查找对呀的文件名
    char *find_name_byino(ino_t ino)
    {
        DIR *dp = NULL;
        struct dirent *dptr = NULL;
        char *filename = NULL;
    
        if(NULL == (dp = opendir("."))) //opendir()打开一个目录,在失败的时候返回一个空的指针,成返回DIR结构体
        {
            fprintf(stderr, "Can not open Current Directory
    ");
            exit(-1);
        }
        else
        {
            while(NULL != (dptr = readdir(dp))) //readdir()用来读取目录。返回是dirent结构体指针
            {
                if(dptr->d_ino == ino)
                {
                    filename = strdup(dptr->d_name); //strdup()将串拷贝到新建的位置处,返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值.
                    break;
                }
            }
    
            closedir(dp);
        }
    
        return filename;
    }
    
    int main(int argc, char *argv[])
    {
        //记录目名的栈
        char *dir_stack[MAX_DIR_DEPTH];
        unsigned current_depth = 0;
    
        while(TRUE)
        {
            ino_t current_ino = get_ino_byname("."); //通过特殊的文件名"."获取当期目录的inode-number
    
            ino_t parent_ino = get_ino_byname(".."); //通过特殊的文件名".."获取当前目录的父目录的inode-number
    
            if(current_ino == parent_ino)
                break;               //达到根目录,推出循环
    
            /*两个inode-number不一样*/
            chdir(".."); //更改当前工作目录,变为当前目录的父目录
            dir_stack[current_depth++] = find_name_byino(current_ino); //"文件名"地址存放
    
            if(current_depth >= MAX_DIR_DEPTH) //路径名太深
            {
                fprintf(stderr, "Directory tree is too deep.
    ");
                exit(-1);
            }
        }
    
        int i = current_depth - 1;
        for(i = current_depth - 1; i >= 0; i--) //打印路径
        {
            fprintf(stdout, "/%s", dir_stack[i]);
        }
        fprintf(stdout, "%s
    ", current_depth == 0 ? "/" : "");
    
    
        return 0;
    }
    

    4、测试

    托管连接

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 75/75 1/1 5/0
    第二周 135/210 1/2 4/9
    第三周 234/444 1/3 6/15
    第四周 486/930 1/4 8/23
    第五周 753/1683 3/7 43/66
    第六周 503/2186 2/9 54/120
    第七周 823/3006 2/11 43/163
    第八周 756/3762 1/12 52/215
    第九周 1120/4882 3/15 63/278

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:XX小时

    • 实际学习时间:XX小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    关于加法的类型转换
    设备事件
    html5 事件
    【环境安装】快速安转TensorFlow
    JApiDocs API文档-超级好用
    Docker(超级详细)
    SpringBoot整合Swagger
    Jenkins +Docker+Git 实现自动部署
    Git commit规范
    java支付宝生成二维码
  • 原文地址:https://www.cnblogs.com/bestixx/p/7860578.html
Copyright © 2020-2023  润新知