2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现
2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现
一、对pwd命令的学习
在终端中输入man pwd
查看手册中对pwd
这一命令的解释:
以绝对路径的方式显示用户当前工作目录。
命令将当前目录的全路径名称(从根目录)写入标准输出。
全部目录使用/分隔,第一个/表示根目录,最后一个目录是当前目录。
执行pwd命令可立刻得知您目前所在的工作目录的绝对路径名称。
偷懒版:
在man pwd
中可以发现一个c语言库中一个名为getcwd函数,man getcwd
查看详细解释:
于是写一个简单的测试代码,果然跟pwd实现的功能一样
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
char *filepath=NULL;
filepath=getcwd(NULL,0);
puts(filepath);
free(filepath);
return 0;
}
但这太偷懒了,以下结合i-Node完成pwd命令功能的实现。
二、实现pwd功能的伪代码
通过上课了解到,文件与i节点其实是连在一起的,在命令行中我们经常使用cd ..
命令返回上级目录,每个目录其实都是与i节点连在一起的,通过ls -i -a
可以查看..
、.
目录对应的i节点值。
我们发现,目录的上级目录..
对应的i-Node和上级目录的当前目录.
的i-Node一致,证明文件路径通过i-Node连接。所以想要完成pwd功能,必须找到一个能查询目录i-Node的函数。
stat结构体:
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //文件内容对应的块数量
};
我们可以看到,ino_t返回了文件的i-Node值,编写一个函数如下:
ino_t get_inode(char *file_name)
{
struct stat file;
int i=stat(file_name,&info);
return file.st_ino;//返回i-Node值
}
接下来就需要思考,pwd打印的是绝对路径,直至根目录,那么如何判断已经到达根目录?根目录的..
、.
的i-Node值是一样的,在我的电脑上他们都是2。
伪代码:
void get_file_name(*filepath){
获取当前i-Node;
通过i-Node获取当前路径名称filepath(%s);
cd ..;
获取当前i-Node;
通过i-Node获取当前路径名filepath称(%s);
get_file_name(*filepath);
if(..i-Node == . i-Node){
return;
}
printf('/'+filename);
return;
}
测试代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
void printpath(ino_t this_inode) {
ino_t my_inode=get_inode(".");
int buflength=20;
if (get_inode("..") != this_inode) {
chdir("..");
char path[buflength]=inode_to_path(this_inode,buflength);
my_inode = get_inode(".");
printpath(my_inode);
printf("/%s", name);
}
}
char * inod_to_path(ino_t i_node, int buflen) {
DIR *dir;
struct dirent *direntp;
dir = opendir(".");
char path[buflen];
while ((direntp = readdir(dir)) != NULL)
if (direntp->d_ino == i_node) {
strncpy(name, direntp->d_name, buflen);
path[buflen - 1] = '\0';
closedir(dir);
return buflen;
}
exit(1);
}
ino_t get_inode(char *filename) { //返回文件的i-Node值
struct stat file;
if (stat(filename, &info) == -1) {
perror(fname);
return 1;
}
return file.st_ino;
}
int main() {
printpath(get_inode("."));
putchar('\n');
return 0;
}
代码调试中的问题:
- 问题1:最开始无法打印出路径名称,总是打印乱码
- 问题1解决方案:路径名称存储在字符串中,字符串的结尾是
'\0'
,在查询路径名称时需要给名称的name[length-1]
赋值'\0'
。
path[buflen - 1] = '\0';
2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现的更多相关文章
- 2017-2018-3 20155337《信息安全系统设计基础》 pwd指令学习
2017-2018-3 20155337<信息安全系统设计基础> pwd指令学习 任务要求 学习pwd指令 研究pwd实现需要的系统调用(man -k:grep),写出伪代码 实现mypw ...
- 2018-2019-1 20165212 《信息安全系统设计基础》第八周学习总结(pwd)
2018-2019-1 20165212 <信息安全系统设计基础>第八周学习总结 一.知识点总结 1.三种并发方式 构造并发程序的方法有三种: 进程 线程 I/O多路复用 进程:用内核来调 ...
- 2018-2019-1 20165226《信息安全系统设计基础》 pwd命令的实现
2018-2019-1 20165226<信息安全系统设计基础> pwd命令的实现 一.学习pwd 查看pwd 得知一个嫩过去文件路径的函数--getcwd i节点值 通过ls -i -a ...
- 20135328信息安全系统设计基础第一周学习总结(Linux应用)
学习计时:共xxx小时 读书: 代码: 作业: 博客: 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Linux中用户管理命令/ ...
- 20155326 2017-2018-1 《信息安全系统设计基础》课下加分项mypwd实现
20155326 2017-2018-1 <信息安全系统设计基础>课下加分项mypwd实现 pwd命令能做什么 在虚拟机中输入pwd查看其返回的是什么 通过上图得知pwd命令用来显示目录. ...
- 2017-2018-1 20155210 《信息安全系统设计基础》 实现mypwd
2017-2018-1 20155210 <信息安全系统设计基础> 实现mypwd 作业要求: 1.学习pwd命令 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码 ...
- 2017-2018-1 20155214 《信息安全系统设计基础》 第9周课下测试-mypwd
2017-2018-1 20155214 <信息安全系统设计基础> 第9周课下测试-mypwd(深入版) 题目要求: 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; ...
- 2017-2018-1 20155216 《信息安全系统设计基础》 实现mypwd
2017-2018-1 20155216 <信息安全系统设计基础> 实现mypwd 作业要求: 1.学习pwd命令 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码 ...
- 2017-2018-1 20155226 《信息安全系统设计基础》课下实践——实现mypwd
2017-2018-1 20155226 <信息安全系统设计基础>课下实践--实现mypwd 1 学习pwd命令 输入pwd命令 发现他是给出当前文件夹的绝对路径. 于是 man 1 pw ...
随机推荐
- 手机端仿ios的三级联动脚本四
二,脚本 <script> $("#city-picker").cityPicker({ title: "选择省市区/县", onChange: f ...
- RobotFramework下的http接口自动化Get Response Status 关键字的使用
Get Response Status 关键字用来获取http请求返回的http状态码. 示例1:访问苏宁易购网站上的http推荐接口,使用Get Response Status 关键字来获取返回的h ...
- Docker学习——Lepus部署
Lepus部署(基于docker)及mysql慢查询配置 介绍 Lepus是一个由Python+PHP开发的数据库企业级监控系统,可用于MySQL/Oracle/MongoDB/Redis 下载镜像 ...
- TCP/IP协议三次握手与四次握手流程解析(转)
一.TCP报文格式 下面是TCP报文格式图: 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标 ...
- 【BZOJ4199】【NOI2015】品酒大会(后缀数组)
[BZOJ4199][NOI2015]品酒大会 题面 BZOJ Uoj 洛谷 题解 考虑最裸的暴力 枚举每次的长度 以及两个开始的位置 检查以下是否满足条件,如果可以直接更新答案 复杂度\(O(n^3 ...
- ECharts组件应用样例代码
一.从Echarts官网上下载最新版本组件 Echarts是百度开发的开源Web图表组件,界面美观,使用简单.组件下载地址:http://echarts.baidu.com/echarts2/doc/ ...
- 关于使用Ajax请求json数据,@RequestMapping返回中文乱码的几种解决办法
一.问题描述: 使用ajax请求json数据的时候,无论如何返回的响应编码都是ISO-8859-1类型,因为统一都是utf-8编码,导致出现返回结果中文乱码情况. $.ajax({ type:&quo ...
- 了解wireshark
Wireshark是很流行的网络分析工具.这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息.与很多其他网络工具一样,Wireshark也使用pcap network lib ...
- 在 HTML5 中捕获音频和视频
简介 长久以来,音频/视频捕获都是网络开发中的"圣杯".多年来,我们总是依赖于浏览器插件(Flash 或 Silverlight)实现这一点.快来看看吧! 现在轮到 HTML5 大 ...
- 记录解决python在spark运行加载第三方库的问题
一般写python的我们经常会import一些常用的库,然后有时集群环境上的python没有这些库,怎么办呢? 通过一段时间的摸索发现有二种方式可以解决这个问题: 第一种方法: 下载对应python的 ...