2017-2018-1 20155315 《信息安全系統設計基礎》加分作業:實現mypwd
阿新 • • 發佈:2017-11-19
解決 連接 i節點 兩種 系統調用 stat 一個 int 代碼
學習pwd命令
- man pwd查看
- pwd命令用於顯示當前工作目錄,是Linux下最常用的命令之一。在不太確定當前位置時,就會使用pwd來判定當前目錄在文件系統內的確切位置。
- 環境變量OLDPWD表示前一次的工作目錄,環境變量PWD表示當前的工作目錄。
- 目錄連接鏈接時,pwd -P 顯示出實際路徑,而非使用連接(link)路徑;pwd顯示的是連接路徑
- /bin/pwd
- -L 目錄連接鏈接時,輸出連接路徑
- -P 輸出物理路徑
研究pwd實現需要的系統調用(man -k; grep),寫出偽代碼
實現pwd有兩種函數,一個是getcwd(),一個是多個函數嵌套。
- getcwd()即得到當前工作目錄,調用這個函數,返回值就是當前目錄。
- 使用系統調用函數,包括
readdir
和chdir
。
原始偽代碼
使用循環不斷進入上級目錄,讀取目錄名
do{
readdir(".");
chdir("..");
}while(i_node("..")!=i_node("."));
但是在編寫的過程中,發現先讀取的是子目錄,而要先顯示的是父目錄。一個解決辦法是將所有讀取到的目錄存到數組中,從最後一個元素開始顯示,但是覺得太麻煩了,改進了代碼。
改進偽代碼
pwd() if(i_node("..")!=i_node(".")) { chdir(".."); pwd(".."); printf(); }
使用遞歸函數,就可以直接從父目錄開始顯示了。
實現mypwd
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <string.h> #include <unistd.h> ino_t get_inode(char*); void pwd(ino_t); void name(ino_t,char*,int); int main() { pwd(get_inode(".")); printf("\n"); return 0; } void pwd(ino_t this_inode) { ino_t my_inode; char its_name[BUFSIZ]; if (get_inode("..")!=this_inode) { chdir(".."); name(this_inode,its_name,BUFSIZ); my_inode = get_inode("."); pwd(my_inode); printf("/%s",its_name); } } void name(ino_t inode,char* namebuf,int buflen) //找到i-節點對應的文件名 { DIR* cdir; struct dirent* direntp; cdir = opendir("."); while((direntp = readdir(cdir)) != NULL) { if(direntp->d_ino == inode) { strncpy(namebuf,direntp->d_name,buflen); namebuf[buflen-1] = ‘\0‘; closedir(cdir); return; } } printf("error looking for inode\n"); } ino_t get_inode(char* fname) //根據文件名,返回-i節點 { struct stat info; stat( fname, &info); return info.st_ino; }
測試mypwd
2017-2018-1 20155315 《信息安全系統設計基礎》加分作業:實現mypwd