您的位置:首页 > 运维架构 > Linux

20155212 C语言实现linux下pwd命令的两种方法

2017-11-19 21:27 1276 查看

20155212 C语言实现linux下pwd命令的两种方法

学习pwd命令

通过
man pwd
命令查看


pwd [OPTION],一般不加参数

-P显示当前目录的物理路径

-L显示当前目录的连接路径

该命令用来显示目前所在的工作目录。指令英文原义:print work directory

系统调用

使用
man -k dir | grep 2
命令查看有哪些跟pwd相关的系统调用



这里有两个系统调用可能用到pwd中

getcwd()


功能:获取当前目录

参数

char *buf:存储当前路径的字符串

size_t size:buf的空间大小

返回值: 成功则返回指向当前路径字符串的指针,错误则返回NULL

readdir()


功能:readdir()返回参数dir目录流的下个目录进入点

参数:DIR * dir。结构dirent定义如下:

struct dirent{
ino_t d_ino;//此目录进入点的inode
off_t d_off;//目录文件开头至此目录进入点的位移
unsigned short int d_reclen;//记录的长度
unsigned char d_type;//文件类型
char d_name[256];
};


返回值:成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL

但是发现readdir()不能单独使用,

opendir()


功能:opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值

参数:路径名

返回值:成功则返回DIR* 型态的目录流,打开失败则返回NULL。

chdir()


功能:切换当前目录

参数:路径名

伪代码

使用getcwd()

定义数组buf[MAXPATH];
调用getcwd(buf, MAXPATH);
输出返回值;


使用readdir()

while(1)
{
读取"."和".."的信息
if("."的inode==".."的inode)
{
退出;
}
else
{
chdir("..");
while(dirent->inode!=前面"."的inode)
{
dirent=readdir();
}
dirent->name入栈;
}
}
for 栈顶->栈底
print 栈顶信息

产品代码

使用getcwd()

#include <stdio.h>
#include <unistd.h>
#define MAXPATH 50

int main()
{
char path[MAXPATH];
puts(getcwd(path, MAXPATH));
return 0;
}


使用readdir()

#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int main()
{

DIR *dirptr=NULL;
struct dirent *current_dirent=NULL, *parent_dirent=NULL, *tmp_dirent=NULL;
int count=0;
ino_t current_inode;
char path[256][256];

while(1)
{
dirptr=opendir(".");
do
{
current_dirent=readdir(dirptr);
}while(strcmp(current_dirent->d_name, ".")!=0);
current_inode=current_dirent->d_ino;
closedir(dirptr);
dirptr=opendir(".");
do
{
parent_dirent=readdir(dirptr);
}while(strcmp(parent_dirent->d_name, "..")!=0);
closedir(dirptr);
if(((long)parent_dirent->d_ino)==((long)current_dirent->d_ino))
{
break;
}
else
{
chdir("..");
dirptr=opendir(".");
do
{
tmp_dirent=readdir(dirptr);
}while(tmp_dirent->d_ino!=current_inode);
closedir(dirptr);
count++;
strcpy(path[count], tmp_dirent->d_name);
}
}
int i;
for(i=count;i>0;i--)
{
printf("/%s", path[i]);
}
printf("\n");

return 0;
}

测试

实现一:使用getcwd()实现pwd



实现二:使用readdir()实现pwd



码云链接

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: