您的位置:首页 > 其它

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,否则返回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\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/01/225/45学习了几个Linux核心命令
第二周55/552/427/72学会了vim,gcc以及gdb的基本操作
第三周148/2031/523/95对信息的表示和处理有更深入的理解
第五周72/2751/625/120对汇编语言有了更深的理解
第六周56/3312/830/150安装了Y86模拟器
第七周61/3921/922/172理解了局部性原理和缓存思想在存储层次结构中的应用
第八周0/3921/1020/192复习前几章内容
第九周132/5242/1224/216了解了Linux操作系统提供的基本I/O服务
第十周420/5242/1420/236对常用指令的代码进行了分析调试,加深了理解

参考资料

《深入理解计算机系统V2》学习指导

2016-2017-1 《信息安全系统设计基础》教学进程

教材导读与每周考试重点

代码驱动的程序设计学习

ioctl()函数详解

Linux使用tcgetattr函数与tcsetattr函数控制终端
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: