模拟实现pwd命令

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <sys/stat.h>
 4 #include <dirent.h>
 5 #include <errno.h>
 6 
 7 bool isRoot(const char* path)
 8 {
 9     if (strcmp(path, "/") == 0)
10         return true;
11 
12     char pp[256] = {0};
13 
14     int l = strlen(path);
15     strcpy(pp, path);
16     
17     if (pp[l - 1] != '/')
18     {   
19         pp[l] = '/';
20         l += 1;
21     }   
22 
23     strcat(pp, "../");
24 
25     struct stat ps; 
26     stat(pp, &ps);
27 
28     struct stat cs; 
29     stat(path, &cs);
30 
31     return ps.st_ino   ==  cs.st_ino &&
32            ps.st_nlink ==  cs.st_nlink &&
33            ps.st_mtime ==  cs.st_mtime;
34 }
35 
36 void printPath(const char* path)
37 {
38     if (isRoot(path))
39     {
40         printf("/");
41         return;
42     }
43 
44     char pp[256] = {0};
45 
46     int l = strlen(path);
47     strcpy(pp, path);
48 
49     if (pp[l - 1] != '/')
50     {
51         pp[l] = '/';
52         l += 1;
53     }
54 
55     strcat(pp, "../");
56     printPath(pp);
57 
58     DIR* dp = opendir(pp);
59     if (!dp)
60     {
61         printf("Failed to open dir %s
", pp);
62         return;
63     }
64 
65     struct stat s;
66     stat(path, &s);
67 
68     char cp[256];
69     while (dirent* en = readdir(dp))
70     {
71         memset(cp, 0, sizeof(cp));
72         strcpy(cp, pp);
73         strcat(cp, en->d_name);
74 
75         struct stat cs;
76         stat(cp, &cs);
77 
78         if (cs.st_ino == s.st_ino && cs.st_mtime == s.st_mtime)
79         {
80             printf("%s/", en->d_name);
81             break;
82         }
83     }
84 }
85 
86 int main(int argc, char* argv[])
87 {
88     printPath("./");
89     printf("
");
90     return 0;
91 }
原文地址:https://www.cnblogs.com/nuoforever/p/14037281.html