实现mypwd(选做)

时间:2019-12-12 20:40:25   收藏:0   阅读:95

实现mypwd(选做)

任务清单
1 学习pwd命令
2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
3 实现mypwd
4 测试mypwd

(一)pwd命令的学习

1、pwd的功能

2、pwd使用示例

技术分享图片

(二)pwd需要的系统调用

技术分享图片

技术分享图片

技术分享图片

技术分享图片

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    char dir[1000];
    char *cwd=getcwd(dir, sizeof(dir));
    if (cwd==NULL)
    {
        perror("Can't get directory!\n");
        return -1;
    }
    else
    {
        printf("%s\n", cwd);
    }
    return 0;
}

技术分享图片

技术分享图片
技术分享图片

while(未到根目录)
    {
      读取当前目录名称;
      打开父目录;
    }
printf(目录);

(三)实现pwd

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

(四)测试pwd

技术分享图片

原文:https://www.cnblogs.com/fzlzc/p/12026705.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!