20155305mypwd的实现和测试

20155305mypwd的实现和测试

pwd命令及其功能

  • 命令格式:
pwd 
  • 命令功能:
    查看”当前工作目录“的完整路径
  • 常用参数:
    一般情况下不带任何参数

作业mypwd代码实现

  • 在课堂上老师讲解了目录其实也是一种文件,只不过这种文件比较特殊,它里面存储的是一张对应表,即文件名和i节点的对应关系表,而i节点才是记录此文件详细信息的结构,如文件大小,属性,权限,存在硬盘的那个块等。
    我们在一个目录创建文件就是在这张表里添加对应关系而已,使用某个文件时也是根据i节点确定在硬盘的实际存储位置的。
#include<stdio.h>  
#include<sys/stat.h>  
#include<sys/types.h>  
#include<dirent.h>  
#include<stdlib.h>  
#include<string.h>  
  
#define SIZE 128  
  
ino_t get_inode(char *dirname);  
void get_work_dir(ino_t inode_num);  
void inode_to_dirname(ino_t inode_num, char *buf, int buflen);  
  
int main(void)  
{  
    get_work_dir(get_inode("."));     
    printf("\n");  
    return 0;  
  
}  
  
ino_t get_inode(char *dirname)  
{  
    struct stat info;  
    if (stat(dirname, &info) == -1)  
    {  
        perror("dirname");  
        exit(1);  
    }  
  
    return info.st_ino;  
}  
  
void get_work_dir(ino_t inode_num)  
{  
    ino_t parent_inode;  
    char buf[SIZE];  
    if (get_inode("..") != inode_num)  
    {  
        chdir("..");  
        inode_to_dirname(inode_num, buf, SIZE);  
        parent_inode = get_inode(".");  
        get_work_dir(parent_inode);  
        printf("/%s", buf);  
    }  
}  
  
void inode_to_dirname(ino_t inode_num, char *buf,int buflen)  
{  
    DIR *dir_ptr;  
    struct dirent *dire;  
    if ((dir_ptr = opendir(".")) == NULL)  
    {  
        perror(".");  
        exit(1);  
    }  
  
    while ((dire = readdir(dir_ptr)) != NULL)  
    {  
        if (dire->d_ino == inode_num)  
        {  
            strncpy(buf, dire->d_name, buflen);  
            buf[strlen(buf)] = '\0';  
            closedir(dir_ptr);  
            return ;  
        }  
    }  
    fprintf(stderr, "error looking for inode number %d\n", (int)inode_num);  
    exit(1);  
}  

posted @ 2017-12-02 13:13  qiaolei  阅读(169)  评论(0编辑  收藏  举报