linux下pwd命令的编写

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* 型指针都不相同?

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值