随手写个pwd命令
首先聲明,這是《Unix/Linux編程實踐教程》書上第4章的一個例子,用以說明chdir命令的使用,以及相關的文件系統內容。網上關于這個代碼例子的網頁(寫在博客上的,百度知道什么的)很多。
根據書上給的思路,寫了個和書上代碼差不多的。
#include<stdio.h>#include<string.h> #include<unistd.h> #include<fcntl.h> #include<sys/stat.h> #include<dirent.h> #include<stdlib.h> #include<errno.h>#define MAX_SIZE 256void do_pwd(char*);int get_inode(char *path) {struct stat info;int inode;if(stat(path,&info)==-1){perror("get inode error");exit(errno);}inode = info.st_ino;return inode; }void get_name_inode(char name[], int inode) {DIR *dir_ptr;struct dirent *ptr;if((dir_ptr = opendir("."))==NULL){perror("dir open error");exit(errno);}while((ptr = readdir(dir_ptr))!=NULL){if(ptr->d_ino==inode){strcpy(name,ptr->d_name);break;}}closedir(dir_ptr);return; }int main(int argc, char *argv[]) {do_pwd(".");printf("\n");return 0; }void do_pwd(char *path) {int flag=0;char name[MAX_SIZE];int inode=get_inode(path);if(inode!=get_inode("..")){chdir("..");get_name_inode(name,inode);do_pwd(".");printf("/%s",name);}return; }
因為用的是書上的思路,書上例子有的問題,這段代碼也一樣有。具體就是,當系統不是掛載在一個分區的時候,這個程序只能顯示到當前分區的根部,即掛載點,而不能繼續向上訪問另外分區的目錄。舉例來說,在我的系統中,/分區和/home分區掛載在不同的硬盤分區上,那么這個程序就只能顯示到username這一級而不能顯示/home。
然后,就想去找gnu的pwd命令實現。根據pwd命令的man手冊,pwd命令在coreutils包中。去網站上下了個包,看pwd.c的源碼,有300多行,編譯了用gdb單步跟了一下,發現代碼邏輯主要就幾行。最主要的就是調用xgetcwd函數。這個函數在源碼文件的lib目錄中的xgetcwd.h中聲明,定義在相應的.c文件中,就幾行,調用了一下getcwd函數,然后返回。
于是,一個功能可用的簡單pwd就像下面這樣:
#include<stdio.h> #include<unistd.h>int main(int argc, char *argv[]) {printf("%s\n",getcwd(NULL, 0));return 0; }編譯、運行。顯示正確。
轉載于:https://www.cnblogs.com/fityme/archive/2013/04/28/3050068.html
總結
- 上一篇: 为ios 应用程序添加图标和添加名字
- 下一篇: Node.js 和Socket.IO 实