20145325张梓靖 《信息安全系统设计基础》第11周学习总结
20145325张梓靖 《信息安全系统设计基础》第11周学习总结
教材学习
- 异常处理 异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序;异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号。异常号是到异常表中的索引。
- 异常的类别 中断处理:异步是指硬件中断不是由任何一条指令造成的,而是由外部I/O设备的事件造成的。陷阱和系统调用:系统调用是一些封装好的函数,内部通过指令int n实现。故障。终止。
- 进程 运行应用程序代码的进程初始时是在用户模式中的。进程从用户模式变为内核模式的唯一方法是通过异常。一个独立的逻辑控制流:程序计数器(PC)值的序列叫做逻辑控制流,简称逻辑流。如下图所示,处理器的一个物理控制流分成了三个逻辑流,每个进程一个。私有地址空间:一个进程为每个程序提供它自己的私有地址空间。
- 上下文切换 a)保存当前进程的上下文;b)恢复某个先前被抢占的进程被保存的上下文; c)将控制传递给这个新恢复的进程。
- 信号(操作系统和应用程序之间) 信号处理过程,发送信号:/bin/kill , kill函数,键盘,alarm函数;接收信号:进程可以通过使用signal函数来修改和信号相关的默认行为。唯一的例外是SIGSTOP和SIGKILL,它们的默认行为不能被修改。
- 非本地跳转(应用层) setjmp函数只被调用一次,但返回多次:一次是当第一次调用setjmp,而调用环境保存在缓冲区env中时,一次是为每个相应的longjmp调用。另一方面,longjmp只调用一次,但从不返回。sig—函数是setjmp和longjmp函数的可以被信号处理程序使用的版本。
代码学习
- exec
-
ls -l命令使用例子:
-
exec1.c与exec2.c使用的运行程序的函数:
-
* 它们分别使用函数所写的参数:
* exec3.c使用了多种exec类型的函数:
* exec3.c代码4种函数的使用效果都是:
- forkdemo
-
fork()作用:
-
forkdemo3.c、forkdemo4.c很好的用到了fork()的不同返回结果
-
getppid():返回父进程pid ; getpid():返回自身pid
-
forkdemo2.c、forkdemo4.c代码分别运行效果:
-
* 对forkgdb.c,在开始以为只要是当 sleep() ,则会运行另一个进程:
发现并没有绝对的关系,再重新运行了一次后,并没有总是在遇到 sleep() 时运行另一个进程
-
SIGCHLD SIGCHLD,在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。
-
fgets char * fgets(char * s, int n,FILE *stream);
参数:- s: 字符型指针,指向存储读入数据的缓冲区的地址。
- n: 从流中读入n-1个字符
- stream : 指向读取的流。
-
psh
- 可执行多参数的命令
- psh1:将标准输入(小于MAXARGS个或出现回车\n)取出放置缓冲区,把其地址存放在arglist中,最终执行输入类型的程序,但不返回主程序
- psh2:一样的目的,只是在执行完标准输入类型的命令时,生成子程序,返回父类
-
fprintf fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件;fprintf()的返回值是输出的字符数,发生错误时返回一个负值.
-
buf
- 缓冲区的测试
- testbuf1中使用的
ffush
:将用户缓冲区的内容加入到输出流里 - testbuf3:stderr是非缓冲的,stdout为行缓冲,所以在运行该程序的时候是stderr的内容先输出
-
pp
- malloc(20):20B的空间
- char **pp:通过指针变量pp的值(地址),找到的还是个地址值,再通过这个新的地址值,才能找到数据
-
system
- system()函数执行了三步操作:
- fork一个子进程
- 在子进程中调用exec函数去执行command
- 在父进程中调用wait去等待子进程结束
- 在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略
- testsystem.c:执行命令仅有2个参数的(包括命令本身)
- system()函数执行了三步操作:
-
waitdemo
- wait(NULL)返回值: 如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
- waitdemo2在waitdemo1的基础上增加了wait函数child_status变量指向的值的某些具有意义的位
-
argtest
- makeargv():该函数利用字符串相关函数分解一行命令,得到程序名和各个参数
- argtest.c:在命令行里只输入一个,即只有argv[0]和argv[1]时,完成多参数的命令执行
本周代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 3500行 | 25篇 | 300小时 | |
第一周 | 70/70 | 2/2 | 22/22 | |
第二周 | 150/220 | 1/3 | 23/45 | |
第三周 | 160/380 | 1/4 | 25/70 | |
第五周 | 250/630 | 1/5 | 30/100 | |
第六周 | 25/655 | 1/6 | 27/127 | |
第七周 | 30/685 | 2/8 | 25/152 | |
第八周 | 0/685 | 2/10 | 20/172 | |
第九周 | 61/685 | 2/12 | 22/194 | |
第十周 | 414/1099 | 3/15 | 20/214 | |
第十一周 | 417/1516 | 2/17 | 21/235 |