首先声明,这是《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 256 void 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; }
编译、运行。显示正确。