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
",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('
');
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] = ' ';
closedir( dir_ptr);
return;
}
}
fprintf( stderr , "error looking for inum % d
" ,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;
}