實現mypwd
阿新 • • 發佈:2017-11-19
types 調用 inode zsh markdown 系統調用 arc add print
實現mypwd
要求:
- 學習pwd命令
- 研究pwd實現需要的系統調用(man -k; grep),寫出偽代碼
- 實現mypwd
- 測試mypwd
1、pwd?
pwd
代表的是打印當前目錄Print Working Directory
,它會打印出以根目錄為起點的完整目錄名即為絕對目錄。這條命令是一條shell內建命令,並且在大多數shell中都可以使用,如bash
、 Bourne
shell
, ksh
,zsh
等。
** 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