linux下pwd命令的编写

来源:互联网 发布:铁路造价软件培训 编辑:程序博客网 时间:2024/05/26 09:55

ubuntu 14.04.2

目录的存储结构

  每个目录下都至少有两个内容‘.’和’..’,其中‘.’代表当前目录,’..’代表上级目录。每个目录或文件都有对应的i-节点号,根目录的‘.’和’..’相同,所以i-节点号相同。通过命令’ls -1ia’(数字1,不是字母l)可以查看当前目录下的文件名和对应的i-节点号。

pwd的具体操作过程



概括来讲,就是:
1.找到本目录的i-节点
2.进入父目录,找到i-节点对应的文件名
3.循环以上过程,直到到达根目

代码实现

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <dirent.h>ino_t get_inode(char*);void printpathto(ino_t);void inum_to_name(ino_t,char*,int);int main(){    printpathto(get_inode("."));  //print path to here    putchar('\n');    return 0;}void printpathto(ino_t this_inode){    ino_t my_inode;    char its_name[BUFSIZ];    /*如果本目录的i-节点与上级目录不同,即本目录不是根目录*/    if (get_inode("..")!=this_inode)                                     {        chdir("..");         //进入上级目录        inum_to_name(this_inode,its_name,BUFSIZ);        my_inode = get_inode(".");        printpathto(my_inode);        printf("/%s",its_name);    }}void inum_to_name(ino_t inode_to_find,char* namebuf,int buflen)   //找到i-节点对应的文件名,并放在字符数组里{    DIR* dir_ptr;    struct dirent* direntp;    dir_ptr = opendir(".");    if (dir_ptr == NULL)    {        perror(".");        exit(1);    }    /*下面这块每太搞明白,功能是寻找制定i-节点的目录,将目录名复制到namebuf中。    但是没明 白他是怎么寻找的*/    /*明白了,每次循环direntp都会指向下一个文件,详见testreaddir.c。    但这是怎么做到的呢?*/    while((direntp = readdir(dir_ptr)) != NULL)    {        if(direntp->d_ino == inode_to_find)        {            strncpy(namebuf,direntp->d_name,buflen);            namebuf[buflen-1] = '\0';            closedir( dir_ptr);            return;        }    }    fprintf( stderr , "error looking for inum % d\n" ,inode_to_find);    exit (1) ;}ino_t get_inode(char* fname)            //根据文件名,返回-i节点{    struct stat info;    if ( stat( fname, &info) == -1){        fprintf( stderr , "Cannot stat ");        perror(fname);        exit (1);    }    return info.st_ino;}

运行结果

一些函数的说明:
int result=stat(char* fname, struct stat* bufp);
stat把文件fname的信息复制到bufp所指的指针里
stat(statue的意思)结构体包含了文件的信息,在/user/include/sys/stat.h中可以看到struct stat的成员变量。

对readdir函数的测试

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <dirent.h>int main(){    DIR* dir_ptr;    struct dirent* direntp;    dir_ptr = opendir(".");    while((direntp = readdir(dir_ptr)) != NULL)    {        printf("/%s\n",direntp->d_name);    }    closedir( dir_ptr);    return 0;}

测试结果

参考文献《Unix/Linux编程实践教程》

遗留问题:为何每次循环使用readdir函数,每次返回的 struct dirent* 型指针都不相同?

0 0