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 ...
随机推荐
- laravel安装nova 运行php artisan migrate出错
报错一$ php artisan migrate Illuminate\Database\QueryException : could not find driver (SQL: select * f ...
- C# Linq to Entity 多条件 OR查询
技术背景:框架MVC,linq to Entity 需要一定的lambda书写能力 问题:在简单的orm中完成一些简单的增删查改是通过where insert delete update 完成的,但是 ...
- Java IO系列之二:NIO基本操作
核心部分 NIO( New Input/ Output) , 引入了一种基于通道和缓冲区的 I/O 方式,NIO 是一种同步非阻塞的 IO 模型.同步是指线程不断轮询 IO 事件是否就绪,非阻塞是指 ...
- pandas 使用panel 报错 Panel is deprecated and will be removed in a future version.
Panel is deprecated and will be removed in a future version.The recommended way to represent these t ...
- 【bzoj 3495】PA2010 Riddle
Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n&l ...
- Studio 5000编程:一种累计时间的编程方法
前言:在很多项目中,需要累计设备的运行.停机.故障时间,当然实现该功能的编程方法也是多种多样,各有千秋,不过有的方法累计误差会越来越大,比如:在连续任务里用定时器来累计时间,就存在一定的误差.本文分享 ...
- 解析中国天气网页面获取七日天气 (Java, Python)
说明 解析中国天气网的页面,获取七日天气. 使用 htmlparser .这是它的 API 文档. 代码 SevenDayWeather.java import java.io.BufferedRea ...
- 3、if和while语句
a=1 b=2 if a<b: print("Yes") print("Yes") print("Yes") print(" ...
- Linux中查看端口占用情况
1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口的使用情况: # lsof -i:8000 2.netstat -tunlp | grep 端口号,用于查看指定的端口号的进 ...
- Node 环境变量 process.env.NODE_ENV 之webpack应用
转载来源:https://github.com/wfzong/NODE_ENV_TEST,这里还有源码可以学习,谢谢原作者的分享! 对于process.env.NODE_ENV困惑起因为在配置webp ...