20155239 2017-11-19 实现mypwd(选做,加分)

题目和要求

  • 学习pwd命令
  • 研究pwd实现需要的系统调用(man -k; grep),写出伪代码
  • 实现mypwd
  • 测试mypwd

首先需要了解的问题:

问题一:该命令的作用和全名称是什么?

print work directory(PWD)该命令用来显示目前所在的工作目录。执行权限面对所有的用户。指令所在路径:/usr/bin/pwd 或 /bin/pwd

问题二:该命令的参数有哪些?

如图:

问题三:什么是系统调用?

由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(ApplicationProgrammingInterface,API)。是应用程序同系统之间的接口。用户在程序的中调用操作系统中的功能子模块。

问题四:man命令的使用和作用?

刚刚学习到Linux的时,通常需要使用man 命令查阅一些命令的帮助信息。一般使用“man 命令名称”的格式就能进行简单的查询。

man -K:显示关键字数据库中包含与作为最终参数给定的字符匹配的标题的字符串的每一行。 可以输入多个标题,中间用空格隔开。 要使用 -k 标志,root 用户必须以前已输入 catman -w 以建立 /usr/share/man/whatis 文件。

包括man的其他主要参数查资料如下:

1. -c

显示使用 cat 命令的手册信息。

2. -t

使用 troff 命令格式化手册信息。如果在超文本信息基中查找到手册页面,则忽略该标志。

3.-f

显示在关键字数据库中仅与作为最终参数给定的命令名相关的项。可以输入多个命令名,中间用空格隔开。使用该标志仅搜索命令物件。要使用 -f 标志,root 用户必须以前已输入catman-w以建立/usr/share/man/whatis 文件。

4.-F

只显示首个匹配项。

5、-m

只在 MANPATH 或 -M 中指定的路径中搜索。

执行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;
}

如图:

PWD需要实现的系统调用

  1. man -k pwd:没有找到任何系统调用

  2. man -k current directory:以pwd的描述作为关键字进行查找

  3. man -k current directory | grep 2:筛选系统调用命令,有一个叫做getcwd的系统调用

系统调用命令:Getcwd

pwd打印的是绝对路径,直至根目录

伪代码:

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>
ino_t get_inode(char *);
void printpathto(ino_t);
void inum_to_name(ino_t, char *, int); int main() {
printpathto(get_inode(".")); /* print path to here */
putchar('\n'); /* then add newline */
return 0;
} /*
* prints path leading down to an object with this inode
* kind of recursive
*/
void printpathto(ino_t this_inode) {
ino_t my_inode;
char its_name[BUFSIZ];
if (get_inode("..") != this_inode) {
chdir(".."); /* up one dir */
inum_to_name(this_inode, its_name, BUFSIZ);/* get its name*/
my_inode = get_inode("."); /* print head */
printpathto(my_inode); /* recursively */
printf("/%s", its_name); /* now print name of this */
}
}
void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen) {
DIR *dir;
struct dirent *direntp;
dir = opendir("."); while ((direntp = readdir(dir)) != NULL)
if (direntp->d_ino == inode_to_find) {
strncpy(namebuf, direntp->d_name, buflen);
namebuf[buflen - 1] = '\0';
closedir(dir);
return;
} 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;
}

20155239 2017-11-19 实现mypwd(选做,加分)的更多相关文章

  1. 20155228 2017-11-19 实现mypwd(选做,加分)

    20155228 2017-11-19 实现mypwd(选做,加分) 题目和要求 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试mypwd ...

  2. 实现mypwd(选做)

    实现mypwd(选做) 任务清单 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd (一)pwd命令的学习 1.pw ...

  3. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.19

    第三次会议:2017-11-16 第二次会议讨论的还没有完全实现,于是在第三次会议上对此进行了一些对我们工作上的看法,得出结论:多花时间啊!!!! 又没照照片图: 会议主要内容: 1.登录注册完善 2 ...

  4. 2017.11.19 C语言基础及流水灯实现

    /* 从右往左*/ #include <reg52.h> sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADD ...

  5. 第一次项目冲刺(Alpha版本)2017/11/19

    一.当天站立式会议 会议内容 1.对数据库的设计的进一步讨论 2.讨论SSH一些配置细节 3.分配今天的任务 二.任务分解图 三.燃尽图 四.心得 1.零散的时间要利用起来,追上计划的进度. 2.在小 ...

  6. 2017.11.9 如何利用JS做登陆验证界面

    ()案例----JavaScript实现输入验证 需要验证的表单输入域和要求 用户名不能为空,是否符合规定的格式 密码长度是否超过6,两次密码输入一致 邮箱地址:邮箱地址必须符合邮箱形式 ~~~注意提 ...

  7. 第31次Scrum会议(11/19)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/19 17:05~17:34,总计29min. 地 ...

  8. 课下选做作业实现mypwd

    2019-2020-1 20175227 <信息安全系统设计基础> 课下选做作业实现mypwd 要求 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 ...

  9. (选做)实现mypwd

    选做 实现mypwd 实验内容: 1.学习pwd命令. 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码. 3.实现mypwd. 4.测试mypwd. 实验步骤: 学习pwd命 ...

随机推荐

  1. zTree自定义节点name显示样式

    //setting中配置属性 view: { showLine:false, dblClickExpand: true, showIcon: false, addDiyDom: addDiyDom / ...

  2. Eigen学习

    Eigen 是一个基于C++的线性代数库,其中实现大量常用的线性代数算法,包括常规矩阵计算,矩阵变换,矩阵分解,矩阵块操作.Eigen 广泛地应用在开源项目中,例如OpenCV,PCL(Point C ...

  3. Linux 运维工程师一定要知道的六类好习惯和23个教训

    一.线上操作规范 1.测试使用当初学习Linux的使用,从基础到服务到集群,都是在虚拟机做的,虽然老师告诉我们跟真机没有什么差别,可是对真实环境的渴望日渐上升,不过虚拟机的各种快照却让我们养成了各种手 ...

  4. 解决eclipse 文件更新不自动刷新的问题

    打开eclipse 1. Window ===> Preferences ===> General ===> Workspace 2. 勾选 1> Refresh using ...

  5. MacOS(苹果电脑&苹果系统)连接京瓷300i 打印机

    前往京瓷官网下载打印机驱动: http://www.kyoceradocumentsolutions.com.cn/support/mfp/download/taskalfa300i.html 驱动安 ...

  6. 3星|《结构思考力》:用金字塔原理整理PPT的思路,案例偏简单

    结构思考力 名义上全书是讲结构化思考,实际内容是用结构化思考的方法来整理PPT的思路,让PPT的逻辑更清晰.少部分提到如何修改标题更吸引人,如何做图表设计. 书中结构化思考的基本思路,重要的有两个:1 ...

  7. November 21st 2016 Week 48th Monday

    A bird is known by its note, and a man by his talk. 闻其声而知鸟,听其言而知人. Listen to what a man talks, watch ...

  8. jprofiler9.2注册码

    jprofiler9.2注册码 2016-08-23 18:11 3658人阅读 评论(2) 收藏 举报 L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620 L- ...

  9. jquery环形3D立体旋转特效

      jquery环形3D立体旋转特效 作者/代码整理:站长素材  (转载请附加本文地址,带有“懒人原生”字样的谢绝转载)发布日期:2013-07-20   立体效果比较强的jquery特效,周围小图组 ...

  10. android小游戏模版—重力感应

               好久没更新博客了,今天来谈谈android小游戏---重力感应,一般在游戏里运用的比較多,比方这类游戏有:神庙逃亡.极品飞车,平衡球.三围重力迷宫,重力赛车等. 首先什么是重力感 ...