20145215《信息安全系统设计基础》第十周学习总结
2016-11-20 12:56
399 查看
20145215《信息安全系统设计基础》第十周学习总结
教材学习内容总结
详情见第九周学习总结视频学习内容总结
ls -l可以显示当前目录下目录或文件的详细属性信息
ls最主要的功能是列出目录内容,显示文件信息
编写ls三大问题
如何列出目录内容
如何读取文件属性
如何判断目录名与文件名
目录文件永远不会为空,每个目录至少包含两个特殊项
.和
..,其中
.表示当前目录,
..表示上一级目录。
相关系统调用:
man -k:将列出整个man page中和“所查找单词”相关的内容,是一种模糊查找。
grep -nr XXX /usr/include:查找宏定义,类型定义。
实践部分
cp1.c
功能:复制文件或目录用法:./cp1 [路径/源文件] [路径/目的文件](默认当前目录)
运行效果:
查看
cp命令的帮助文档:
echostate.c
功能:查看在命令行中输入命令时是否可见,可见返回1,否则返回0echo is on:命令可见
echo is off:命令不可见
运行效果:
研究代码的过程中,查看了其中几个函数的帮助文档:
tcgetattr:
tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中
tcsetattr:
tcsetattr函数tcsetattr函数用于设置终端参数。
perror:打印错误信息
此外,为了更好的理解函数返回值的过程,我用
grep命令查看了其中的几个宏变量:
ECHO:显示输入字符,值为0000010
c_lflag:本地模式标志,控制终端编辑功能
setecho.c
功能:设置echo的状态,用来改变输入指令是否可见。输入y(或是以y开头的一串字符),命令可见
否则(即输入不以y开头的字符),命令不可见
运行效果:
fileinfo.c
功能:查看文件信息运行效果:
查看
stat函数的帮助文档:
各宏变量的意义:
mode:st_mode 文件的类型和存取的权限
links:st_nlink 连到该文件的硬链接数目,刚建立的文件值为1
user:st_uid 用户ID
group:st_gid 组ID
size:st_size 文件字节数
modtime:st_mtime 最后一次修改时间
filesize.c
功能:查看文件大小(老师给的代码中指定了查找/etc/passwd文件的大小,所以不管后面输入什么文件名,程序都只查找
etc/passwd)
初始运行效果:
为了实现用户想查看的指定文件大小, 对代码进行如下修改:
#include <stdio.h> #include <sys/stat.h> #include <stdlib.h> //exit() int main(int argc, char * argv[]) { struct stat infobuf; char *filename; if (argc != 2) { printf("Please input filename\n"); exit(-1); } filename = argv[1]; if ( stat(filename, &infobuf) == -1 ) perror(filename); else printf(" The size of %s is %d\n",filename, infobuf.st_size ); }
此时编译运行便能得到我们想要的结果:
ls1.c
功能:显示指定目录下的所有文件(默认为当前目录)运行效果:
ls2.c
功能:显示指定目录下的文件详细信息(默认为当前目录)运行效果:
spwd.c
功能:显示当前目录路径初始运行效果:
分析
代码由4个函数组成,分别是:main函数:主函数
get_inode函数:取某个文件的索引信息(进入点)
printpathto函数:打印路径
inum_to_name函数:将长整型的索引信息转化为字符串的形式
执行指令查看stat:
man 2 stat
文件的索引信息,“number”告诉我们它是一个数字表示,而不是一个确切的路径,这就好比我们有时候用文件描述符来操作文件,而不用字符数组(文件名)来操作。
整个代码概括来讲,就是:
找到本目录的i-节点
进入父目录,找到i-节点对应的文件名
循环以上过程,直到到达根目录
需要注意的是,chdir()这个系统调用,是改变当前程序的工作目录,不是改变bash的工作目录,这是不一样的。还有,改动是立即生效的,在需要用到工作目录(其实就是一个路径名)的时候,程序就会读取某个地方的信息,当调用chdir()时,直接把这个信息更改,后续的读取到的工作目录就会改变。
当我尝试着用
man -k指令搜索有关于工作目录的函数时,找到了一个非常强大的函数:
函数
getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数maxlen为buffer的空间大小。
有了这个函数,代码的编写也非常简单:
#include "unistd.h" #include "stdio.h" int main(void) { printf("%s\n",getcwd(NULL,0)); return 0; }
最终运行效果和
pwd指令一模一样:
testioctl.c
功能:查看窗体大小信息运行效果:
查看
isatty和
ioctl函数的帮助文档:
isatty:判断文件描述词是否是为终端机,如果参数所代表的文件描述词为一终端机则返回1,否则返回0。
ioctl:是设备驱动程序中对设备的I/O通道进行管理的函数,其中d是用户程序打开设备时使用open函数返回的文件标示符,request是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,这个参数的有无和request的意义相关
who1.c
功能:从UTMP_FILE文件中读取系统中用户信息
运行效果:
本周代码托管截图
代码托管链接:click here托管截图及代码行数统计:
心得体会
经过本周的学习之后,对系统调用的重要性有了更深的认识。实际上,很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。此外,在平常的编程中,很多情况下,系统调用是实现想法的简洁有效的途径,所以有可能的话我们应该尽量多掌握一些系统调用,这会对我们的程序设计过程带来意想不到的帮助。学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/2 | 25/45 | 学习了几个Linux核心命令 |
第二周 | 55/55 | 2/4 | 27/72 | 学会了vim,gcc以及gdb的基本操作 |
第三周 | 148/203 | 1/5 | 23/95 | 对信息的表示和处理有更深入的理解 |
第五周 | 72/275 | 1/6 | 25/120 | 对汇编语言有了更深的理解 |
第六周 | 56/331 | 2/8 | 30/150 | 安装了Y86模拟器 |
第七周 | 61/392 | 1/9 | 22/172 | 理解了局部性原理和缓存思想在存储层次结构中的应用 |
第八周 | 0/392 | 1/10 | 20/192 | 复习前几章内容 |
第九周 | 132/524 | 2/12 | 24/216 | 了解了Linux操作系统提供的基本I/O服务 |
第十周 | 420/524 | 2/14 | 20/236 | 对常用指令的代码进行了分析调试,加深了理解 |
参考资料
《深入理解计算机系统V2》学习指导2016-2017-1 《信息安全系统设计基础》教学进程
教材导读与每周考试重点
代码驱动的程序设计学习
ioctl()函数详解
Linux使用tcgetattr函数与tcsetattr函数控制终端
相关文章推荐
- 20145215《信息安全系统设计基础》第五周学习总结
- 20145327 《信息安全系统设计基础》第十周学习总结
- 20145227《信息安全系统设计基础》第十周学习总结
- 20145206 《信息安全系统设计基础》第十周学习总结
- 20145319 《信息安全系统设计基础》第十周学习总结
- 20145215《信息安全系统设计基础》第六周学习总结
- 20144303《信息安全系统设计基础》第十周学习总结
- 20145211 《信息安全系统设计基础》第十周学习总结——水流无限似侬愁
- 20145311 《信息安全系统设计基础》第十周学习总结
- 20145329 《信息安全系统设计基础》第十周学习总结
- 20145228 《信息安全系统设计基础》第十周学习总结 (2)
- 20145215《信息安全系统设计基础》第九周学习总结
- 20145240 《信息安全系统设计基础》第十周学习总结
- 20145215《信息安全系统设计基础》第七周学习总结
- 20145215《信息安全系统设计基础》第二周学习总结
- 20145315 《信息安全系统设计基础》第十周学习总结
- 20145337 《信息安全系统设计基础》第十周学习总结
- 20145207《信息安全系统设计基础》第十周学习总结
- 20145339顿珠《信息安全系统设计基础》第十周学习总结
- 20145216史婧瑶《信息安全系统设计基础》第十周学习总结