20145215《信息安全系统设计基础》第十周学习总结
教材学习内容总结
- 详情见第九周学习总结
视频学习内容总结
-
ls -l
可以显示当前目录下目录或文件的详细属性信息
-
ls
最主要的功能是列出目录内容,显示文件信息 -
编写ls三大问题
- 如何列出目录内容
- 如何读取文件属性
- 如何判断目录名与文件名
-
目录文件永远不会为空,每个目录至少包含两个特殊项
.
和..
,其中.
表示当前目录,..
表示上一级目录。 -
相关系统调用:
man -k
:将列出整个man page中和“所查找单词”相关的内容,是一种模糊查找。grep -nr XXX /usr/include
:查找宏定义,类型定义。
实践部分
cp1.c
-
功能:复制文件或目录
-
用法:./cp1 [路径/源文件] [路径/目的文件](默认当前目录)
-
运行效果:
-
查看
cp
命令的帮助文档:
echostate.c
-
功能:查看在命令行中输入命令时是否可见,可见返回1,否则返回0
echo 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
");
exit(-1);
}
filename = argv[1];
if ( stat(filename, &infobuf) == -1 )
perror(filename);
else
printf(" The size of %s is %d
",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
",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 | 对常用指令的代码进行了分析调试,加深了理解 |