首页 > 其他 > 详细

实现mypwd

时间:2019-12-12 09:11:54      阅读:78      评论:0      收藏:0      [点我收藏+]

C语言实现mypwd

学习pwd命令

搜索pwd命令的相关资料
技术分享图片

Linux pwd命令用于显示工作目录。

执行pwd指令可立刻得知您目前所在的工作目录的绝对路径名称。

pwd -P 显示当前工作目录物理路径

pwd -L 显示当前的工作目录 / 链接逻辑路径

技术分享图片

研究pwd实现需要的系统调用(man -k; grep),写出伪代码

通过man -k dir | grep get查询关于获取相关的命令。
技术分享图片

我们发现getcwd是获取当前目录,再通过man getwd来获取信息。
技术分享图片

直接调用函数即可

#include<stdio.h>
#include<unistd.h>
int main(){
 char a[100];
 getwd(a);
 printf("%s\n",a);
 return 0;
}

还可以通过操作目录文件来进行实现pwd功能

1.打开文件目录查看所有目录如果查到当前目录中有两个相同的" ."文件说明已经到了文件根目录,也就是说本目录的i-node与上级目录的i-node相同。
2.否则进入".."文件目录,并且将上一级件目录名记录添加到数组中
3.直到符合1的条件为止

输入man -k open | grep dir,查看打开文件目录流有关的内容
技术分享图片

还需要读取目录的信息 man -k read | grep dir 发现readdir符合要求。
技术分享图片

结束需要关闭文件目录流man -k close | grep dir,找到符合条件的函数:closedir
技术分享图片

通过man opendir,man readdir,man closedir等得知各个函数所需的头文件以及函数参数

技术分享图片

技术分享图片

技术分享图片

struct dirent{
  ino_t  d_ino;//文件结点号
  off_t  d_off;
  unsigned short d_reclen;
  unsigined char d_type;
  char d_name[256];//文件名
}

实现mypwd

最终代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

ino_t get_inode(char*);
void printpathto(ino_t);
void inode_to_name(ino_t,char*,int);
int main()
{
    printpathto(get_inode("."));  
    putchar('\n');
    return 0;
}

void printpathto(ino_t this_inode)
{
    ino_t my_inode;
    char its_name[BUFSIZ];
    if (get_inode("..")!=this_inode)                                
    {
        chdir("..");         
        inode_to_name(this_inode,its_name,BUFSIZ);
        my_inode = get_inode(".");
        printpathto(my_inode);
        printf("/%s",its_name);
    }
}
void inode_to_name(ino_t inode_to_find,char* namebuf,int buflen)   
{
    DIR* dir_ptr;
    struct dirent* direntp;
    dir_ptr = opendir(".");
    if (dir_ptr == NULL)
    {
        perror(".");
        exit(1);
    }
    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)            
{
    struct stat info;
    if ( stat( fname, &info) == -1){
        fprintf( stderr , "Cannot stat ");
        perror(fname);
        exit (1);
    }
    return info.st_ino;
}

测试mypwd

技术分享图片

实现mypwd

原文:https://www.cnblogs.com/L1079991001/p/12026833.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!