20145215《信息安全系统设计基础》第十周学习总结

20145215《信息安全系统设计基础》第十周学习总结

教材学习内容总结

视频学习内容总结

  • ls -l可以显示当前目录下目录或文件的详细属性信息

  • ls最主要的功能是列出目录内容,显示文件信息

  • 编写ls三大问题

    1. 如何列出目录内容
    2. 如何读取文件属性
    3. 如何判断目录名与文件名
  • 目录文件永远不会为空,每个目录至少包含两个特殊项...,其中.表示当前目录,..表示上一级目录。

  • 相关系统调用:

    • man -k:将列出整个man page中和“所查找单词”相关的内容,是一种模糊查找。
    • grep -nr XXX /usr/include:查找宏定义,类型定义。

实践部分

cp1.c

  • 功能:复制文件或目录

  • 用法:./cp1 [路径/源文件] [路径/目的文件](默认当前目录)

  • 运行效果:

  • 查看cp命令的帮助文档:

echostate.c

  • 功能:查看在命令行中输入命令时是否可见,可见返回1,否则返回0

    • echo is on:命令可见
    • echo is off:命令不可见
  • 运行效果:

  • 研究代码的过程中,查看了其中几个函数的帮助文档:

  • tcgetattrtcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中

  • tcsetattrtcsetattr函数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

  • 功能:查看窗体大小信息

  • 运行效果:

  • 查看isattyioctl函数的帮助文档:

  • 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 对常用指令的代码进行了分析调试,加深了理解

参考资料

posted @ 2016-11-20 12:56  L.X.M  阅读(459)  评论(4编辑  收藏  举报