2017-2018-1 20155320加分项目——pwd的实现
2017-2018-1 20155320加分项目——pwd的实现
1 学习pwd命令
2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
3 实现mypwd
4 测试mypwd
实现过程
- 首先通过man 命令了解了一下pwd的用法



-课上楼老师提供的思路是
1.先利用readdir 读取当前目录
2.循环调用cd .. 找到上一级目录
按照这个思路我的伪代码如下
首先通过读取当前目录的i-node节点,找到当前目录
判断是否为根目录,如果不是则通过chdir找到上一级目录,并打印出当前目录,更新当前目录
循环1,2步直到找到根目录为止
实现
- 之前没有用过readdir函数,通过man 命令了解了一下readdir函数的用法,发现他在很多情况下都要和opendir搭配使用

- 关于
cd ..的实现,我通过查找发现chdir这个函数可以达到这个效果

- 获取当前目录的i-node,需要用到stat函数:
头文件:
#include <sys/stat.h>
#include <unistd.h>
定义函数: int stat(const char *file_name, struct stat *buf);
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno

代码如下:链接
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include<string.h>
ino_t get_inode(char* file);//取得文件名对应的i-node
void get_inode_name(ino_t i_node,char *file_name,int length);//取得i-node对应的文件名
void print_direct(ino_t i_node);//打印目录
void main()
{
ino_t i_node;//i-node指针
//char *file=".";
print_direct(get_inode("."));
printf("\n");
}
void print_direct(ino_t i_node)//打印目录
{
ino_t n_inode;
char *file_name[256];
if(get_inode("..")!=get_inode(".")){//判断是否是根目录
chdir("..");//进入上级目录
get_inode_name(i_node,file_name,256);
n_inode=get_inode(".");//更新当前目录的i-node
print_direct(n_inode);
printf("/%s",file_name);
}
}
void get_inode_name(ino_t i_node,char *file_name,int length)
//取得i-node 对应的文件名
{
DIR* dir_ptr;
struct dirent* direntp;
dir_ptr = opendir(".");
while((direntp = readdir(dir_ptr)) != NULL)//当获取下一个目录流进入点失败时返回NULL
{
if(direntp->d_ino==i_node)//如果direntp索引节点号与待找的i—node相同时
{
strncpy(file_name,direntp->d_name,length);
file_name[length-1]='\0';
closedir(dir_ptr);
}
// else
// printf("failed to find the name of i-node");
}
}
ino_t get_inode(char* file)//取得文件名对应的i-node
{
struct stat buf;
if(stat(file,&buf)!=-1)//执行成功
{
return buf.st_ino;
}
else{
printf("failed to get inode");
}
}
- 运行结果为:

实现中出现的问题
- 问题1:编译出现如下问题:

-解决:
1.发现需要补充上头文件<string.h>
2.bufsize 需要给定定义,我干脆将数组长度定为最大的256
3.比较时需要用==


- 问题2:解决完以上问题后,发现编译没有错误了,但是却运行不出来结果

- 解决:起初感觉是代码的问题,改了很多都没能解决,后来在舍友的建议下用娄老师的虚拟机试了一下,居然运行出了结果!!只是出现了如下提示,这是我自己设置的错误提示并且打印出来了结果

后来好好看了一下我的代码发现,不能将错误提示放在while里面
,将其删掉就好了,放到VB上也能运行正常,只是现在仍然不懂为什么之前在VB上运行不出来

2017-2018-1 20155320加分项目——pwd的实现的更多相关文章
- 2017-2018-1 20155338 加分项目——PWD的实现
2017-2018-1 20155338 加分项目--PWD的实现 项目要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试 ...
- 2017-2018-1 20155330 《信息安全系统设计基础》加分项目--实现mypwd
2017-2018-1 20155330 <信息安全系统设计基础>加分项目--实现mypwd pwd命令 命令功能:查看"当前工作目录"的完整路径. 通过man命令查看 ...
- 2017 年度码云新增项目排行榜 TOP 50,为它们打“call”
2017 年度码云新增项目排行榜 TOP 50 正式出炉 !2017 结束了,我们来关注一下这一年里码云上新增的最热门的开源项目吧.此榜单根据 2017 年在码云上新增开源项目的 Watch.Star ...
- 2017 码云最火爆开源项目 TOP 50,你都用过哪些
本文转自:https://share.html5.qq.com/fx/u?r=JdjvzwC 2017 年度码云热门项目排行榜 TOP 50 出炉啦!我们根据所有开源项目在码云的用户关注度.活跃度.访 ...
- MyEclips 2017/2018 (mac 版)安装与破解
MyEclips 2017/2018 (mac 版)安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEclips ...
- MyEclipse 2017/2018 安装与破解 图文教程
SSM 框架-02-MyEclipse 2017/2018 安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEc ...
- </2017><2018>
>>> Blog 随笔原始文档及源代码 -> github: https://github.com/StackLike/Python_Note >>> 统计信 ...
- 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)
2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...
- 我的2017&2018
最近项目进入验收阶段,所以上班没那么忙碌了,但是怎么说呢,我可能天生是闲不住的主,觉得浑身不自在(我这样的人是不是特别不会享福),此处应该有个笑脸哈. 翻看了博客园好几个大牛写的技术文章,感慨大牛不愧 ...
随机推荐
- windows2003 iis6配置文件和win2008/2012 iis7.5配置文件
转载某大牛.... 日国外站的单子 :反正跑着玩 简单看下 先 在线web扫描 https://www.yascanner.com/之后发现存在注入漏洞 asp的站 穿山甲可以注入,但是发现是m ...
- MD5随机盐值生成法
public class Test3 { /** * 生成含有随机盐的密码 */ public static String generate(String password) { Random r = ...
- memcached的操作
memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库次数,从而提高动态.数据库驱动网站的速度.memcached基于 ...
- Java虚拟机6:垃圾收集(GC)-1(内存溢出和内存泄漏的区别)
1.前言 在进行垃圾收集之前需要普及几个比较重要的概念. 2.内存溢出和内存泄露的概念和区别: (1):内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间可以分配,系统不 ...
- [转]MBTiles 离线地图演示 - 基于 Google Maps JavaScript API v3 + SQLite
MBTiles 是一种地图瓦片存储的数据规范,它使用SQLite数据库,可大大提高海量地图瓦片的读取速度,比通过瓦片文件方式的读取要快很多,适用于Android.IPhone等智能手机的离线地图存储. ...
- wfst讲解
一.比较好的博客 1.0 官方网站 1.1 语音识别解码器(1)—自动机与半环 1.2 走进语音识别中的WFST 1.3Kaldi WFST 构图 学习 二.比较好的paper 三.开源项目 3.1 ...
- 【转】 Tomcat+redis+nginx配置
为客户开发的一个绩效系统,采用了java web的开发方式,使用了一些spring mvc, mybatis之类的框架.相比于oracle ebs的二次开发,这种开发更加灵活,虽然和ebs集成的时候遇 ...
- 【题解】洛谷P1373 小a和uim之大逃离(坐标DP)
次元传送门:洛谷P1373 思路 设f[i][j][t][1/0]表示走到(i,j)时 小a减去uim的差值为t 当前是小a取(0) uim取(1) 那么转移就很明显了 f[i][j][t][]=(f ...
- 查看apache当前并发访问数和进程数
1.查看apache当前并发访问数: netstat -an | grep ESTABLISHED | wc -l 对比httpd.conf中MaxClients的数字差距多少. 2.查看有多少个进程 ...
- iOS10 语音播报填坑详解(解决串行播报中断问题)
iOS10 语音播报填坑详解(解决串行播报中断问题) 在来聊这类需求的解决方案之前,咱们还是先来聊一聊这类需求的真实使用场景:语音播报.语音播报需求运用最为广泛的应该是收银对账了,就类似于支付宝.微信 ...