20165235 实现pwd功能
20165235 实现pwd功能
要求
- 学习pwd命令
2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码
3.实现mypwd - 测试mypwd
实现过程
- pwd是将当前的文件目录的绝对路径打印出来,所以要找到一个函数可以返回当前文件目录名。所以在命令行中输入
man -k dir | grep get得到如下的信息:

- 如上图:getwd正是我们所需要的,通过命令输入:
man getwd得到如下信息:

- 如上图:它所需的头文件和函数以及参数一目了然。getwd():函数功能描述:将当前工作目录的绝对路径复制到数组指针buf中。
-根据以上信息编写代码:
#include<stdio.h>
#include<unistd.h>
int main(){
char a[100];
getwd(a);
printf("%s\n",a);
return 0;
}
- 编译代码并且运行,结果如下:

但是发现以上代码过于简单,是否有一种方法是可以通过操作目录文件来进行实现pwd功能。所以有以下伪代码:
1.打开文件目录查看所有目录如果查到当前目录中有两个相同的" ."文件说明已经到了文件根目录,也就是说本目录的i-node与上级目录的i-node相同。
2.否则进入".."文件目录,并且将上一级件目录名记录添加到数组中
3.直到符合1的条件为止
- 首先需要打开文件目录流,命令行输入
man -k open | grep dir找到了符合条件的函数:opendir。

- 然后需要读取目录的信息,输入
man -k read | grep dir,找到符合条件的函数:readdir

- 结束需要关闭文件目录流
man -k close | grep dir,找到符合条件的函数:closedir

- 通过
man opendir,man readdir,man closedir等得知各个函数所需的头文件以及函数参数


- 对于读取文件目录流涉及到一个结构体:

struct dirent{
ino_t d_ino;//文件结点号
off_t d_off;
unsigned short d_reclen;
unsigined char d_type;
char d_name[256];//文件名
}
最重要的一点是要进入到上级目录中去,所以我
man -k dir | change,没有查处结果,我就直接man -k dir,找到如下结果:

所以根据以上内容编写代码:(函数模块)
ino_t get_inode(char* fname) //根据文件名,返回-i节点
void inode_to_name(ino_t inode_to_find,char* namebuf,int buflen) //找到i-节点对应的文件名,并放在字符数组里
void printpathto(ino_t this_inode)//如果不是根目录进入上级结点,并将文件夹名存入数组,否则直接打印
实验截图:

实验代码链接
遇到的错误
- 当我将返回文件结点号的函数设计成如下时:
ino_t get_inode(char* fname) //根据文件名,返回-i节点
{
DIR *dir;
struct dirent *pdir;
dir = opendir(fname);
if (dir == NULL)
{
perror(".");
exit(1);
}
while((pdir = readdir(dir)) != NULL)
{
if(pdir->d_name == fname)
{
return pdir -> d_ino;
}
}
}
最后的结果显示为空:

- 没能找到出错的原因,我将每次读取的文件名打印出来,也没发现有错误存在。
20165235 实现pwd功能的更多相关文章
- linux笔记:目录处理命令ls,mkdir,cd,pwd,rmdir,cp,mv,rm
linux命令的格式:命令 [-选项] [参数]例:ls -la /etc 命令:ls命令所在路径:/bin/ls功能:显示目录文件用法:ls [-aldh] []参数:-a 查看所有文件,包括隐藏文 ...
- 2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现
2017-2018-1 20155201 <信息安全系统设计基础> pwd命令的实现 一.对pwd命令的学习 在终端中输入man pwd查看手册中对pwd这一命令的解释: 以绝对路径的方式 ...
- Linux文件系统命令 pwd
命令名:pwd 功能:查看当前所处的位置 eg: renjg@renjg-HP-Compaq-Pro--MT:~$ pwd /home/renjg renjg@renjg-HP-Compaq-Pro- ...
- 2018-2019-1 20165212 《信息安全系统设计基础》第八周学习总结(pwd)
2018-2019-1 20165212 <信息安全系统设计基础>第八周学习总结 一.知识点总结 1.三种并发方式 构造并发程序的方法有三种: 进程 线程 I/O多路复用 进程:用内核来调 ...
- pwd命令学习
pwd命令学习 1.学习pwd命令 pwd命令功能为输出当前所在工作目录的绝对路径名称. 绝对路径和相对路径: 绝对路径:从根目录开始直到文件位置 相对路径:相对于程序当前所在目录到文件位置 例:程序 ...
- SQLALchemy(连表)、paramiko
本节内容:
- Linux笔记-常用的命令(15-3-30)
vim命令参考: http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html [1]解压文件格式的区别: *.tar ...
- Linux命令自己总结
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- Linux常用命令总结——文件管理
Linux中的目录 路径:也就是linux中的目录(文件夹)有绝对路径和相对路径 根目录:/ 用户主目录(home directory):位于/home目录下,用户登录时 工作目录(working d ...
随机推荐
- 关于vue的增删改查操作
利用vue也可以实现数据的增删改查,只是未涉及到数据库,只是在浏览器页面中进行操作. 将datas数组中的数据循环输出: 再增加一行,用于保存新数据,编辑数据后保存: 此时,数据已经呈现出来,开始进行 ...
- DirectX11--深入理解与使用2D纹理资源
前言 写教程到现在,我发现有关纹理资源的一些解说和应用都写的太过分散,导致连我自己找起来都不方便.现在决定把这部分的内容整合起来,尽可能做到一篇搞定所有2D纹理相关的内容,其中包括: DDSTextu ...
- BeanUtils 日期转换(本地格式yyyy-MM-dd)转换成date
1.BeanUtils工具的使用 1)beanUtils 可以便于对javaBean的属性进行赋值. 2)beanUtils 可以便于对javaBean的对象进行赋值. 3)beanUtils可以将一 ...
- L1-Day11
1.问问他能不能来.[我的翻译]Ask him wether he can come.[标准答案]Ask him whether/if he can come.[对比分析]天呐 whether都能拼写 ...
- verdi\debussy的使用技巧
verdi\debussy的使用技巧 转载from 大西瓜FPGA 大西瓜FPGA-->https://daxiguafpga.taobao.com fsdb display Debussy本身 ...
- 第十六节,OpenCV(学习五)边缘检测
边缘检测 边缘检测的目的是标识数字图像中亮度变化明显的点,边缘检测是特征提取的重要领域. 1.检测方法 边缘检测的方法大致分为两类:基于搜索和基于零交叉 基于搜索的边缘检测方法首先计算边缘强度,通常用 ...
- Linux的简单命令
Linux的简单命令 1.更改linux服务器的登录密码 成功登录后输入命令: passwd 然后按照提示操作即可 2.在当前路径下新建文件夹:mkdir 新建文件夹名 3.解压和压缩文件tar.gz ...
- openssl 1.1.1 reference
openssl 1.1.1 include/openssl aes.h: # define HEADER_AES_H aes.h: # define AES_ENCRYPT 1 aes.h: # de ...
- 我的redis入门之路
1:操作环境:vmware12 , centOs7 ,redis5.0.3 centOs7安装与下载链接(原文地址): https://blog.csdn.net/qq_42570879/articl ...
- 定时-thinkphp
链接:https://pan.baidu.com/s/1wHayb9fYOiiMB3Scms0iRQ 提取码:51ex 复制这段内容后打开百度网盘手机App,操作更方便哦