1. 程式人生 > >實現mypwd

實現mypwd

types 調用 inode zsh markdown 系統調用 arc add print

實現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\n");
        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.\n");
            exit(-1);
        }
    }

    int i = current_depth - 1;
    for(i = current_depth - 1; i >= 0; i--) //打印路徑
    {
        fprintf(stdout, "/%s", dir_stack[i]);
    }
    fprintf(stdout, "%s\n", 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小時

  • 改進情況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

參考資料

  • 《深入理解計算機系統V3》學習指導
  • ...

實現mypwd