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
来源:https://www.cnblogs.com/L1079991001/p/12026833.html