实现mypwd

非 Y 不嫁゛ 提交于 2019-12-12 09:26:55

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!