2018-2019-1 20165221 《信息安全系统设计》第六周学习总结

2018-2019-1 20165221 《信息安全系统设计》第六周学习总结

知识点总结

课本知识:

  • I/O:在主存和外部设备(例如磁盘存储器、终端和网络)之间复制数据的过程。

  • 输入操作是从I/O设备复制数据到主存,而输出操作是从主存复制数据到 I/O设备。
    所有I/O设备都被模型化为文件。

  • Linux shell创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)标准输出(描述符为1)标准错误(描述符为2)

  • 每个Linux文件都有一个类型来表明它在系统中的角色:
    1、普通文件包含任意数据;2、目录是包含一组链接的文件;3、套接字是用来与另一个进程进行跨网络通信的文件;

  • 对内核而言,文本文件和二进制文件没有任何区别。区别是相对应用程序而言的

  • 在某些情况下,read和write传送的字节比应用程序要求的要少。这些不足值不表示有错误。出现这样情况的原因有:

    1、读时遇到EOF2、从终端读文本行3、读和写网络套接字

  • st_size成员包含了文件的字节数大小。st_mode成员则编码了文件访问许可位。

  • 内核用三个相关的数据结构来表示打开的文件:

    1.描述符表2、文件表3、v-node表

  • 典型的打开文件的内核数据结构:
    image

博客知识:

  • 操作系统完成的「硬件相关、应用无关」的工作比喻成两个角色:

    1. 管家婆
    2. 服务生
  • 操作系统通过三抽象概念完成了「管家婆」的功能:

header 1 header 2
抽象一 通过「文件」对I/O设备进行了抽象
抽象二 通过「虚存」对主存和I/O设备进行了抽象
抽象三 通过「进程」对CPU、主存和I/O设备进行了抽象

who命令如何使用

  • 可以查看当前登录的账户,终端和近期的登陆时间
  • 键入man 1 who可以具体查看该命令的用法
  • who命令的其他几种形式:
header 1 header 2
形式1 whoami
形式2 who am i
形式3 who mom likes
  • who的帮助文档提供了重要的信息:
    If FILE is no specified, use /var/run/utmp,/var/log/wtmp as FILE is common.
  • 下面进行具体查看和捕捉


    由此证实关于utmp是一条记录,一条记录组成的文件的猜想。
  • 找到实现who命令的代码:

如何自己编写who命令

  • 具体代码:
#include    <stdio.h>
#include    <stdlib.h>
#include    <utmp.h>
#include    <fcntl.h>
#include    <unistd.h>

int show_info( struct utmp *utbufp )
{
    printf("%-8.8s", utbufp->ut_name);  
    printf(" ");                
    printf("%-8.8s", utbufp->ut_line);  
    printf(" ");                
    printf("%10ld", utbufp->ut_time);   
    printf("
");               
    return 0;
}

int main()
{
    struct utmp  current_record;    
    int     utmpfd;     
    int     reclen = sizeof(current_record);
    //打开utmp 文件
    if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
        perror( UTMP_FILE );    
        exit(1);
    }

    //读取utmp中的每一条记录
    while ( read(utmpfd, &current_record, reclen) == reclen )
        //显示记录中的相关信息
        show_info(&current_record);
 
    //关闭utmp文件
    close(utmpfd);
    return 0;           
}

学习linux系统编程的方法

  • 仔细研究manpages
  • 问题驱动,使用man -k key1|grep key2|...在manpages中搜索你要的内容
  • 阅读.h文件: 可以通过grep -nr XXXX /usr/incldue查找相关的宏定义,结构体定义,类型定义等
  • 解决一个问题要多个系统调用,可以参考manpagesSEE ALSO部分来得到相关系统调用的信息

  • 文本文件易读取,占位置;二进制文件灵活易存储,读取难

参考资料

原文地址:https://www.cnblogs.com/0630tx/p/9904343.html