Linux getcwd()的实现【转】
生活随笔
收集整理的這篇文章主要介紹了
Linux getcwd()的实现【转】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://www.cnblogs.com/alan-forever/p/3721908.html
通過getcwd()可以獲取當前工作目錄。
1 #include <unistd.h> 2 3 char *getcwd(char *cwdbuf, size_t size);成功調用返回指向cwdbuf的指針,失敗返回NULL。
getcwd()的實現是《Linux/Unix系統編程手冊》的練習18.5,題目如下:
實現一個功能與getcwd()相當的函數。提示:要獲取當前工作目錄的名稱,可調用opendir()和readdir()來遍歷其父目錄(..)中的各個條目,查找其中與當前工作目錄具有相同i-node編號及設備號的一項。如此這般,沿著目錄樹層層拾級而上(chdir(..))并進行掃描,就能構建出完整的目錄路徑。當前目錄與當前工作目錄相同時,就結束遍歷。無論調用該函數成功與否,都應將調用者遣回其起始目錄(使用open()和fchdir()能方便地實現這一功能)
1、通過stat獲取文件信息,根據文件信息中的i-node編號和設備號來找到正確的目錄
2、運用opendir()、readdir()來獲取目錄的信息,目錄不能通過read()來獲取信息。
PS:tlpi_hdr.h頭文件為《Linux/Unix系統編程手冊》的頭文件,可以去作者的網站下載,其中的errExit()為錯誤處理函數。。。。
1 /*2 * =====================================================================================3 *4 * Filename: 18.5.c5 *6 * Description: 7 *8 * Version: 1.09 * Created: 2014年05月11日 14時04分35秒10 * Revision: none11 * Compiler: gcc12 *13 * Author: alan (), alan19920626@gmail.com14 * Organization: 15 *16 * =====================================================================================17 */18 19 #include <sys/stat.h>20 #include <fcntl.h>21 #include <dirent.h>22 #include <sys/types.h>23 #include "tlpi_hdr.h"24 25 #define BUF_MAX 409626 27 extern int errno; 28 29 char *Getcwd(char *cwdbuf, size_t size){30 char path[BUF_MAX], cwd[BUF_MAX];31 DIR *dirp;32 struct dirent *dp;33 struct stat sb, sb_d, sb_1;34 dev_t dev;35 ino_t ino;36 37 while(1){38 //獲取當前目錄的文件信息39 if(stat(".", &sb) == -1)40 errExit("stat");41 dev = sb.st_dev;42 ino = sb.st_ino;43 44 //獲取父目錄的對應的目錄流和父目錄的文件信息45 if((dirp = opendir("..")) == NULL)46 errExit("opendir");47 if(stat("..", &sb_1) == -1)48 errExit("stat");49 50 //判斷當前目錄是否與父目錄相同51 if(sb_1.st_dev == dev && sb_1.st_ino == ino)52 break;53 54 errno = 0;55 56 //在父目錄對應的目錄流讀取條目57 while((dp = readdir(dirp)) != NULL){58 snprintf(path, BUF_MAX, "../%s", dp->d_name);59 60 if(stat(path, &sb_d) == -1)61 errExit("stat");62 63 //得到當前目錄對應的條目并將目錄逐漸完善64 if(dev == sb_d.st_dev && ino == sb_d.st_ino){65 memset(cwd, 0, sizeof(cwd));66 if(strcat(cwd, "/") == NULL)67 errExit("strcat");68 if(strcat(cwd, dp->d_name) == NULL)69 errExit("strcat");70 if(strcat(cwd, cwdbuf) == NULL)71 errExit("strcat");72 73 if(strncpy(cwdbuf, cwd, BUF_MAX) == NULL)74 errExit("strncpy");75 break;76 }77 78 }79 80 if(dp == NULL && errno != 0)81 errExit("readdir");82 83 closedir(dirp);84 chdir(".."); //改變當前目錄85 }86 87 return cwdbuf;88 }89 90 int main(int argc, char *argv[]){91 char buf[BUF_MAX];92 char t_buf[BUF_MAX];93 char *p;94 int fd;95 96 if((fd = open(".", O_RDONLY)) == -1)97 errExit("open");98 99 if(argc != 1) 100 usageErr("%s", argv[0]); 101 102 p = Getcwd(buf, BUF_MAX); 103 if(p == NULL) 104 errExit("My getcwd"); 105 printf("My getcwd: %s\n", p); 106 fchdir(fd); //遣回最初的目錄 107 108 p = getcwd(t_buf, BUF_MAX); 109 if(p == NULL) 110 errExit("getcwd"); 111 printf("getcwd: %s\n", p); 112 113 exit(EXIT_SUCCESS); 114 }測試結果:
lancelot@debian:~/Code/tlpi$ pwd /home/lancelot/Code/tlpi lancelot@debian:~/Code/tlpi$ ./18.5 My getcwd: /home/lancelot/Code/tlpi getcwd: /home/lancelot/Code/tlpi,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Linux getcwd()的实现【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP代码审计笔记--变量覆盖漏洞
- 下一篇: oracle 动态注册和静态注册