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 [选项 ...

随机推荐

C#基础---C#如何对Json字符串处理

Json字符串对于做web应用的应该很熟悉,其实在很多请求我们返回的都是Json字符串.那对于C#代码如何处理Json字符串呢,.Net封装了一个类叫做JavaScriptSerializer[MSD ...

hdoj 5317 RGCDQ

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 #include ; int F[MAXN]; bool flag ...

SpringBoot 配置定时任务

SpringBoot启用定时任务,其内部集成了成熟的框架,因此我们可以很简单的使用它. 开启定时任务 @SpringBootApplication //设置扫描的组件的包 @ComponentScan ...

linux下部署monogoDB服务(以及安装php mogodb扩展)

这两天网站转移到新的服务器后,登录时出现一个问题,会等待几分钟服务器才响应. 开始以为是nginx服务器的问题,后面经过排查发现是php一个登陆验证的函数的问题,每次跑到这个函数就会迟钝几分钟. 经过 ...

Android 仿携程活动列表边框布局

实现如下图所示的一个页面布局 布局框架 思路讲解: 1.一开始的思路是使用android提供的画布将布局中的内容花下来,之后想了想觉得比较麻烦,所以又开启了另外一条思路. 2.如上图“布局框架”所示. ...

python turtle 例子 海归绘图

太阳花 1 # coding=utf-8 2 import turtle 3 import time 4   5 # 同时设置pencolor="red", fillc ...

【CodeForces】983 E. NN country 树上倍增+二维数点

[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...

AS打开速度慢,AS项目导入慢,新建项目导入慢

1.AS打开速度慢 在Android Studio的bin目录里,打开idea.prooperties文件,添加disable.android.first.run=true 再次打开时,启动加快 2. ...

[T-ARA][Goodbye, OK]

歌词来源:http://music.163.com/#/song?id=22704437 作曲 : 안영민 , 이유진 [作曲 : a-nyeong-min , i-yu-jin] 作词 : 안영민 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值