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、读时遇到EOF;2、从终端读文本行;3、读和写网络套接字;
-
st_size
成员包含了文件的字节数大小。st_mode
成员则编码了文件访问许可位。 -
内核用三个相关的数据结构来表示打开的文件:
1.描述符表;2、文件表;3、v-node表
-
典型的打开文件的内核数据结构:
博客知识:
-
操作系统完成的「硬件相关、应用无关」的工作比喻成两个角色:
- 管家婆
- 服务生
-
操作系统通过三抽象概念完成了「管家婆」的功能:
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("\n");
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, ¤t_record, reclen) == reclen )
//显示记录中的相关信息
show_info(¤t_record);
//关闭utmp文件
close(utmpfd);
return 0;
}
学习linux系统编程的方法
- 仔细研究
manpages
- 问题驱动,使用
man -k key1|grep key2|...
在manpages中搜索你要的内容 - 阅读.h文件: 可以通过
grep -nr XXXX /usr/incldue
查找相关的宏定义,结构体定义,类型定义等 - 解决一个问题要多个系统调用,可以参考
manpages
的SEE ALSO
部分来得到相关系统调用的信息
- 文本文件易读取,占位置;二进制文件灵活易存储,读取难