日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

随手写个pwd命令

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随手写个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

總結

以上是生活随笔為你收集整理的随手写个pwd命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。