2018-2019-1 20165208 《信息安全系统设计基础》第七️周学习总结
教材学习
man -k key1 | grep key2| grep 2
: 根据关键字检索系统调用
grep -nr XXX /usr/include
:查找宏定义,类型定义- 异常可以分为四类:中断、陷阱、故障和终止。
syscalls n
指令允许用户对内核服务受控访问,即用户请求服务n。执行syscalls会导致异常处理程序的陷阱。- 函数和系统调用本质上都是函数。不同的是,系统调用运行在内核模式中,普通函数调用运行在用户模式中。
- 进程总是处于下面三种状态之一:运行、停止、终止。
- 将设备优雅的映射为文件:打开文件、改变当前的文件位置、读写文件、关闭文件。
- linux文件三种表现类:普通文件(包括文本文件和二进制文件)、目录、套接字。
- open函数:用来打开一个已存在的文件或创建新文件。若成功则返回新文件描述符,出错返回-1。
- read、write函数执行输入和输出。
ssize_t & size_t:size_t型输入为无符号长整型,ssize_t型返回值为有符号长整型,因为考虑到出错时许返回-1。
教材实践
有关函数使用
- getpid
每个进程都有唯一的正数进程ID(PID)。查看帮助文档如下图所示:
getpid函数返回调用进程的PID,getppid函数返回它的父进程的PID。 - fork
man 2 fork
命令查看其帮助文档,如下图所示:
即创建一个子进程,需要包含的头文件是#include <unistd.h>。
在父亲进程中其返回值时子进程的PID,在子进程中其PID是0。
它还与下列函数有关:clone(2), execve(2), exit(2), setrlimit(2), unshare(2),
vfork(2), wait(2), daemon(3), capabilities(7), creden‐
tials(7)
试运行老师的代码效果如下:
- waitpid
man 2 waitpid
命令查看其帮助文档,如下图所示:
"wait for process to change state"等待一个进程去改变当前状态。需要包含的头文件是:#include <sys/types.h>;#include <sys/wait.h>。
wait()返回终止子进程的PID,出错时返回-1;waitpid()返回状态改变的子进程的PID,出错时同样返回-1。
它们还和下列函数有关: _exit(2), clone(2), kill(2), ptrace(2), sigaction(2), signal(2),
wait4(2), pthread_create(3), credentials(7), signal(7)
wait()和waitpid()的用法有所不同。wait()挂起调用进程直到有一其子女运行终止;waitpid()挂起调用进程执行直到由PID参数指定的子状态已更改。
试运行代码如下:
- sleep
将一个进程挂起一段指定的时间。如果请求的时间量已经到了,sleep返回0,否则返回还剩下的要休眠的秒数。 - execve
在当前进程的上下文中加载并运行一个新的程序。如果成功则不返回,如果错误则返回-1。 - exit
man 2 exit
查看帮助文档后,如下图所示:
terminate the calling process
终止当前唤起的进程。包含的头文件是:#include <unistd.h>.且这个系统调用没有返回值。
课上实践
- 参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接。
- 伪代码如下:
打开目录文件
针对目录文件
读取目录条目
显示文件名
关闭文件目录文件 - 实验效果图
- 代码托管
其他(感悟、思考等,可选)
这两章学了很多新函数,越发感受到了man 命令的方便,感觉有时候写代码还是很困难,但对于C语言实现linux命令大概有个框架了。
参考资料
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第三周 | 432/432 | 2/2 | 11/11 | |
第四周 | 549/549 | 1/3 | 8/8 | |
第五周 | 692/692 | 1/4 | 9/9 | |
第六周 | 776/776 | 2/6 | 13/13 | |
第七周 | 902/902 | 1/7 | 15/15 |