c语言实现pwd,20155222 c语言实现pwd命令(示例代码)

20155222 c语言实现linux的pwd命令

1.学习pwd命令在Linux层次结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录中。想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名。

742527b5a3f46de24320b015489a1e03.png

2.研究实现pwd所需的系统调用

53cd34f68f7f7407199bb538c830e7ab.png

opendir(打开目录)

相关函数 open,readdir,closedir,rewinddir,seekdir,telldir,scandir

表头文件

#include

#include

定义函数

DIR * opendir(const char * name);

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

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

错误代码 EACCESS 权限不足

EMFILE 已达到进程可同时打开的文件数上限。

ENFILE 已达到系统可同时打开的文件数上限。

ENOTDIR 参数name非真正的目录

ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符

串。

ENOMEM 核心内存不足。

ed823d95522b35e0d9e80a7c5d834677.png

readdir(读取目录)

相关函数 open,opendir,closedir,rewinddir,seekdir,telldir,scandir

表头文件

#include

#include

定义函数 struct dirent * readdir(DIR * dir);

函数说明 readdir()返回参数dir目录流的下个目录进入点。

结构dirent定义如下

struct dirent

{

ino_t d_ino;

ff_t d_off;

signed short int d_reclen;

unsigned char d_type;

har d_name[256;

};

d_ino 此目录进入点的inode

d_off 目录文件开头至此目录进入点的位移

d_reclen _name的长度,不包含NULL字符

d_type d_name 所指的文件类型

d_name 文件名

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

附加说明 EBADF参数dir为无效的目录流。

范例:

#include

#include

#include

main()

{

DIR * dir;

struct dirent * ptr;

int i;

dir =opendir(“/etc/rc.d”);

while((ptr = readdir(dir))!=NULL)

{

printf(“d_name: %s\n”,ptr->d_name);

}

closedir(dir);

}

执行

d_name:.

d_name:..

d_name:init.d

d_name:rc0.d

d_name:rc1.d

d_name:rc2.d

d_name:rc3.d

d_name:rc4.d

d_name:rc5.d

d_name:rc6.d

d_name:rc

d_name:rc.local

d_name:rc.sysinit

e9b16b73d4afd1f7151a547d2f207b57.png

closedir(关闭目录)

相关函数 opendir

表头文件

#include

#include

定义函数 int closedir(DIR *dir);

函数说明 closedir()关闭参数dir所指的目录流。

返回值 关闭成功则返回0,失败返回-1,错误原因存于errno 中。

错误代码 EBADF 参数dir为无效的目录流

3.实现步骤:

步骤一:查看当前目录"."文件的inode-number

步骤二:查看当前目录“..”文件的inode-number

步骤三:比较两个inode-number,若相等,已到根目录,进入步骤四,否则进入“..”,根据步骤一中获取的inode-number,在目录中查找相应的文件名并将其入栈,回到步骤一。

步骤四:依次出栈输出路径名

4.实现代码

#include

#include

#include

#include

#include

#include

#include

int main()

{

char this_name[20]=".",father_name[20]="..";

char name[16][32];

struct dirent *this_dir=NULL,*father_dir=NULL,*temp=NULL;

DIR *dir=NULL;

int i=0;

unsigned long int this_ino;

while(1)

{

dir = opendir(this_name);

if(dir == NULL)

printf("error open");

while(1)

{

this_dir = readdir(dir);

if(strcmp(this_dir->d_name,".")==0)

break;

}

this_ino=this_dir->d_ino;

closedir(dir);

dir = opendir(father_name);

while(1)

{

father_dir = readdir(dir);

if(father_dir->d_name[0]==‘.‘&&father_dir->d_name[1]==‘.‘)

break;

}

if(this_dir->d_ino==father_dir->d_ino)

break;

closedir(dir);

dir=opendir(father_name);

while((temp=readdir(dir))!=NULL)

{

if(temp->d_ino==this_ino)

{

bzero(name[i],32);

strcat(name[i++],temp->d_name);

break;

}

}

closedir(dir);

strcat(this_name,"/..");

strcat(father_name,"/..");

}

for(i--;i>=0;i--)

printf("/%s",name[i]);

printf("\n");

}

5.测试代码

a70b5da46c5180a334702f4109ffa8a5.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值