linux 指令实现,linux pwd指令的C实现

linux pwd指令的C实现

pwd指令的功能介绍

linux pwd命令用于显示工作目录

执行pwd命令可立刻得知当前所在工作目录的绝对路径名称。

示例:

5934365cd68e3d6256f6b123a4731225.png

查询系统手册

50286779c58306f14fc3d747ef0d880f.png

如图所示,getcwd的描述是“get current working directory”,这与我们要实现的pwd命令的功能非常相近,于是我继续查询getcwd

76c6f9970bf9e5e7bd02df431958aedf.png

如图所示,有关getcwd的用法及描述中提到它的功能是返回一个包含调用程序所在位置绝对路径的以空字符为结尾的字符串,这显然正是我们需要实现的功能!

实现pwd命令(一)

到此为止,第一代mypwd就已经成型了,只要在程序中使用getcwd()函数就可以实现获得绝对路径的功能了。

以下为实现mypwd的C语言代码

#include

#include

#include

int main(void)

{

char buf[1024];

char *cwd =getcwd(buf, sizeof(buf));

if (NULL == cwd) {

perror("Get cerrent working directory fail.\n");

exit(-1);

} else {

printf("%s\n", cwd);

}

return 0;

}

测试结果

adf960925ce9f7b8dd0f5bee99802766.png

实现pwd命令(二)

第一代mypwd命令其实已经实现了pwd的功能,但这显然只能实现其功能,而不能了解其工作原理,过于耍流氓,因此我继续参考有关linux的目录的资料

linux中目录的文件组织方式

在一个文件系统中,一个inode代表一个文件,并使用一个整数值来表示该inode,称为inode-number,该值对于一个文件系统而言是唯一的,即通过该值可以找到其对应的inode。一般情况下,一个文件只有一个inode信息来描述它。

本学期的学习中,我们一直在强调一个概念,“linux系统下,一切皆文件”,因此毫无疑问,目录也是文件,也必定是由inode组织的。

因此,我们通常所说的目录a“包含”文件b,其实现层面上的意思是,目录a的内容列表里有一个关于文件b的列表项,即“b的inode-number+b的filename”。综上,Linux中,一个文件(包括目录)的文件名,及文件名与inode的对应关系,都是由包含该文件的目录所描述的。

伪代码

现在我们了解了可以实现工作目录与上级目录inode值的比对来判断是否追溯到根目录,为了实现这个上溯目录的功能,我们可以使用如图所示这个函数:

93491130331eb9c4d3f6b7ae7ab251cf.png

chdir("..")即可实现向上级目录跳转

定义用来存储路径的字符数组

通过特殊文件名“.”获得当前工作目录名称

chdir()返回上级目录

if(本目录inode-number和上级inode-number不同),本目录不是根目录,继续向上查找

else

是根目录,可以输出绝对路径了

详细代码

有了上述的思路,我们可以写出详细代码:

#include

#include

#include

#include

ino_t get_inode(char*);

void printpathto(ino_t);

void inum_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];

/*如果本目录的inode-number与上级目录不同,即本目录不是根目录*/

if (get_inode("..")!=this_inode)

{

chdir(".."); //进入上级目录

inum_to_name(this_inode,its_name,BUFSIZ);

my_inode = get_inode(".");

printpathto(my_inode);

printf("/%s",its_name);

}

}

void inum_to_name(ino_t inode_to_find,char* namebuf,int buflen) //找到inode-number节点对应的文件名,并放在字符数组里

{

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) //根据文件名,返回inode-number

{

struct stat info;

if ( stat( fname, &info) == -1){

fprintf( stderr , "Cannot stat ");

perror(fname);

exit (1);

}

return info.st_ino;

}

测试结果

b98e6f492899126ff3aefa70816af1ce.png

参考资料

《Unix环境高级编程》

博客园连接

linux pwd指令C实现

linux pwd指令C实现 研究实现pwd所需的系统调用 我们可以通过man命令和grep命令来获取我们所需要的系统调用函数信息 man chdir Linux pwd命令用于显示工作目录. 执行p ...

linux常用指令

整理下来的linux常用指令 mount [-t 文件系统] 设备文件名 挂载点挂载命令,一般用于在挂载ISO,或者其他比如U盘等设备时使用,[-t iso9660]为固定格式,可写可不写,非必写项. ...

Linux基础指令

Linux基础指令 只写了最简单的一些文件操作,基本没有带参数 查看当前目录 pwd 跳转到某路径 cd 查看当前目录下的文件 ls ls -l // -l 查看详细信息 打开当前所在文件夹 open ...

Linux基本指令

常用目录文件作用 - /    根目录 - /bin    命令保存目录(普通用户就可以读取的命令) - /boot    启动目录,启动相关文件 - /dev    设备文件保存目录 - /etc  ...

Linux常用指令【转载】

[收藏]Linux常用指令[转载] $ 命令行提示符 粗体表示命令 斜体表示参数 filename, file1, file2 都是文件名.有时文件名有后缀,比如file.zip command 命令 ...

【ZZ】Linux常用指令

linux常用指令 - 个人文章 - SegmentFault 思否 https://segmentfault.com/a/1190000011068772 查看目录下有什么文件信息 ls //lis ...

2017-2018-3 20155337《信息安全系统设计基础》 pwd指令学习

2017-2018-3 20155337 pwd指令学习 任务要求 学习pwd指令 研究pwd实现需要的系统调用(man -k:grep),写出伪代码 实现mypw ...

Linux基础指令--韩顺平老师课程笔记

一.vi和vim编辑器 ①.三种模式 所有的 Linux 系统都会内建 vi 文本编辑器.vim 具有程序编辑的能力,可以看做是 vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计. ...

linux学习(四)-----linux常用指令

touch 指令 touch 指令创建空文件 基本语法 touch 文件名称 应用实例 案例 1: 创建一个空文件 hello.txt cp 指令 cp 指令拷贝文件到指定目录 基本语法 cp [选项 ...

随机推荐

twitter点赞动画详解

今天在微博上看到@过气网红一丝 的一篇微博,codepen上贴出了twitter点赞那个动画效果的源码,地址 http://codepen.io/yisi/pen/LpXVJb .我看了下效果很好看, ...

Xcode 安装插件手误选择了「Skip Bundle」后需要重新允许「Load Bundle」的解决方法

在 Mac 终端输入命令: # 这里的7.1代表 Xcode 的版本号 defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugI ...

angularjs 获取地址传参

.controller('CityCtrl', function ($scope, $location,$ionicModal) { 注入location服务 $scope.name = $locat ...

zoj 3647 Gao the Grid

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4837 先求出从所有点随机找出三个点的组合数,然后去掉共线的,平行好去掉,斜线就 ...

CentOS7.1 使用资源搜集

1.配置java环境 -openjdk* 测试 java -version 2.安装Tomcat8.0.35 点击题目可以参考源网页,但有些代码无法执行,更改如下(亲测可行): 一定要先安装java环 ...

Swift中GCD与NSOperation相关

GCD Swift 3必看:从使用场景了解GCD新API 常用写法: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_ ...

AnimatorController动画融合树

通过Unity动画状态机,能帮我们轻松处理转换各个动画片断,达到想要的效果,但是如果仅仅是一个个动画的硬生生的切换,那么看起来就非常突然,而不真实了,在质量要求比较高的游戏中,特别是动作游戏,我们就不 ...

如何为ASP.NET Core的强类型配置对象添加验证

原文: Adding validation to strongly typed configuration objects in ASP.NET Core 作者: Andrew Lock 译文: La ...

Kong(V1.0.2) Clustering Reference

介绍 Kong集群允许您通过添加更多的机器来处理更多的传入请求来水平扩展系统.它们将共享相同的配置,因为它们指向相同的数据库.指向相同数据存储的Kong节点将是相同Kong集群的一部分. 您需要在Ko ...

[No0000B8]WPF或Winform调用系统Console控制台显示信息

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值