首先声明,这是《Unix/Linux编程实践教程》书上第4章的一个例子,用以说明chdir命令的使用,以及相关的文件系统内容。网上关于这个代码例子的网页(写在博客上的,百度知道什么的)很多。

根据书上给的思路,写了个和书上代码差不多的。


#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;
}

编译、运行。显示正确。

相关文章: