国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux getcwd()的實現

2024-06-28 13:26:23
字體:
來源:轉載
供稿:網友
linux getcwd()的實現

通過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.c  5  *  6  *    Description:    7  *  8  *        Version:  1.0  9  *        Created:  2014年05月11日 14時04分35秒 10  *       Revision:  none 11  *       Compiler:  gcc 12  * 13  *         Author:  alan (), alan19920626@Gmail.com 14  *   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 4096 26  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/tlpilancelot@debian:~/Code/tlpi$ ./18.5 My getcwd: /home/lancelot/Code/tlpigetcwd: /home/lancelot/Code/tlpi

吐槽&收獲:本來打算慢慢通過寫學習記錄,但是覺得學習很多只是通過把一些重點寫出來和一些習題,所以打算放一放,有空再寫。重點什么的還要慢慢總結。先把一些習題做了,順便結合之前學得系統調用和庫函數做一些實際的東西先。。。。。。一個下午做這么一條題。。。真心弱菜,不過做出來真得很開心。。。。。還有慢慢長路要走!!!繼續努力!!!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西丰县| 民乐县| 鄢陵县| 成武县| 肥西县| 依兰县| 林口县| 东辽县| 桑日县| 桐乡市| 青州市| 新宁县| 玉环县| 海阳市| 达日县| 高要市| 云林县| 扶风县| 汉源县| 城固县| 阳春市| 潮安县| 安新县| 彩票| 洛宁县| 新绛县| 桦南县| 五原县| 大姚县| 扶风县| 北川| 蒲城县| 阿拉善左旗| 陆川县| 肃北| 民县| 弥勒县| 定远县| 磴口县| 咸丰县| 来凤县|