20155212 2017-2018-1 《信息安全系统设计》第6周学习总结
教材学习内容总结
Chapter 8
- fork函数调用一次,返回两次。fork函数被父进程调用一次,但是却返回了两次,一次返回在父进程中,返回结果是子进程的PID值,一次返回到子进程中,返回结果是0
- 子进程和父进程并发执行,内核以任意的方式交替执行它们的逻辑控制流中的指令。无法对不同进程中指令的交替执行做任何假设。
- 子进程和父进程拥有相同的地址空间,相同的用户栈,相同的全局变量值,相同的代码段,因为子进程得到了父进程用户级虚拟地址空间相同的一份拷贝,但是而这确实相互独立的,拥有自己私有地址空间。
- 在程序中x的值对子进程和父进程而言是相互独立的,不受影响的。
- 子进程获得了与父进程任何打开的文件描述符相同的拷贝,所以对本例而言,子进程也获得了标准输出的文件描述符
- 对于内置命令,外壳进程会马上解释这个命令。
- 对于可执行文件,外壳父进程会在一个新的子进程的上下文中加载并运行这个文件。
- 可执行目标文件不是一个内置的外壳命令,所以外壳会通过调用某个驻留在存储器中称为加载器的操作系统代码运行。
- 加载器可以通过execve函数进行调用。加载器将可执行目标文件中的代码和数据从磁盘中拷贝到存储器中,然后通过跳转到程序的第一条指令或者入口点来运行程序。
- 将程序拷贝到存储器并运行的过程叫做加载。
- 用户栈在运行时创建,总是从合法用户地址开始,向下增长(向低存储器地址方向增长)。
- 从栈的上部开始的段是为操作系统驻留的存储器的部分(内核)的代码和数据保留的。
- 进程总是处在下面三种状态的一种:运行、停止、终止。
- 进程终止的原因:
- 收到一个默认行为是终止进程的信号
- 从主程序中返回
- 调用exit函数
- 进程一般是通过父进程进行回收,如果父进程没有回收它的僵死的子进程就终止了,那么内核就安排init进程来回收它们。
- 僵死进程虽然没有运行,但是依然消耗系统的存储器资源,父进程回收已终止的子进程是,内核将子进程的退出状态传递给父进程,然后抛弃已经终止的进程。
- 父进程通过调用waitpid函数来等待它的子进程终止或者停止。每个waitpid函数对应一个等待集合
- 如果pid>0,等待集合就是一个单独的子进程,它的进程ID等于pid。
- 如果pid=-1,等待集合就是由父进程所有的子进程组成。
- option默认为0,决定waitpid的操作,默认情况下,waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。waitpid返回已经终止的子进程的PID,并将这个已终止的子进程从系统中去除。
- 可以通过如下的几个宏定义,判断status的状态信息。
- WIFEXITED(status):如果子进程通过调用exit或者返回正常终止,则返回真
- WEXITSTATUS(status):返回一个正常终止的子进程的退出状态
- WIFSIGNALED(status):如果子进程接收到一个默认行为是终止进程的信号而终止的,则返回真
- WTERMSIG(status):如果子进程是因为信号的原因终止,则返回信号的编号
- WIFSTOPPED(status):如果引起返回的子进程当前是被停止的,则返回真
- WSTOPSIG(status):返回引起子进程终止的信号的数量 - 错误条件
- 如果调用进程没有子进程,则waitpid返回-1,并且设置errno为ECHILD
- 如果waitpid函数被一个信号中断,则返回-1,并设置errno为EINTER - 信号是软件层面上的异常
- 发送信号的原因:
- 内核检测到一个系统事件b
- 一个进程调用了kill函数,显式地要求内核发送一个信号给目的进程。 - 内核通过更新目的进程的上下文的某个状态,发送一个信号给目的进程
- 发送信号的方式:
- 通过/bin/kill程序发送信号
- 通过键盘发送
- 通过kill函数发送
- 通过alarm函数发送
- 与键盘相关的信号
- SIGINT:来自键盘的终端信号(CTRL+C)
- SIGQUIT:来自键盘的退出信号(CTRL +)
- SIGSTOP:来自键盘(CTRL+Z)或调试程序的停止信号
- 信号处理问题分析的三大要点
- 待处理信号被阻塞
- 待处理信号不会排队
- 系统调用可以被中断
- setjmp函数在env缓冲区中保存当前调用环境,以供后面的longjmp使用,并返回0
- longjmp函数从env缓冲区中恢复调用环境,然后触发一个从最近一次初始化env的setjmp调用的返回。
- 非本地返回的一个重要意义在于允许从一个深层嵌套的函数中立即返回,而不用费力解开调用栈。
代码托管
其他
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 96/96 | 1/1 | 15/15 | |
第二周 | 30/126 | 1/2 | 21/36 | |
第三周 | 30/156 | 1/3 | 21/57 | |
第四周 | 10/156 | 1/4 | 20/77 | |
第五周 | 23/189 | 1/5 | 20/97 | |
第六周 | 201/390 | 1/6 | 8/95 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:10小时
-
实际学习时间:8小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)