20145331 《信息安全系统设计基础》第11周学习总结
20145331《信息安全系统设计基础》第十一周学习总结
教材学习内容总结
8.1告诉你异常四种,其中陷阱可以用来做系统调用。
Linux的聪明机制——/proc文件系统,将许多内核数据结构的内容输出为一个用户程序可以读的文本文件的层次结构。
8.2进程的概念,并发流、上下文切换在后面也要继续用到。
8.3错误处理包装函数。
8.4介绍了很多函数,Fork函数上课重点提到了,它是调用一次,返回两次;而且父子进程并发执行。execve函数那有些看不懂,仍在看。
8.5讲信号,类型很多,分发送和接收信号,发送部分有很多函数,接收用signal;多个信号处理方法就是p511的那三点。
代码实践
fork
1、forkdemo1
使用fork创建子进程的父进程,调用fork一次,打印两个输出行
2、forkdemo2
调用两次fork,一共产生四个子进程,打印四个输出行
3、forkdemo3
父进程返回调用进程子进程的PID,不为0,输出 i am the parent……
4、forkdemo4
getpid返回调用进程的PID
getppid返回它的父进程的PID
5、forkgdb
父进程和子进程这两个线程是并发运行的独立进程,一个在休眠时另一个在执行,两个相互独立不干扰。
exec
1、exec1.c
exec1.c中execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中
exevp函数调用成功没有返回,所以没有打印出“ * ls is done. bye”这句话
2、exec2.c
exec2与exec1的区别就在于exevp函数的第一个参数,exec1传的是ls,exec2直接用的arglist[0],不过由定义可得这两个等价,所以运行结果是相同的
3、exec3.c
函数中execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……最后一个参数必须用空指针(NULL)作结束
wait
1、waitdemo1
waitdemo1.c的功能是如果有子进程,则终止子进程,成功返回子进程pid。
2、waitdemo2.c
waitdemo2.c比起1来就是多了一个子进程的状态区分,把状态拆分成三块,exit,sig和core。
psh
1、psh1
输入要执行的指令,回车表示输入结束,然后输入的每个参数对应到函数中,再调用对应的指令。
2、psh2
比起1来,多了循环判断,不退出的话就会一直要你输入指令,并且对于子程序存在的状态条件。
test
1、testbuf1
用到了fflush(stdout),目的是清空缓冲,强制结果马上显示到屏幕上
2、testbuf2
testbuf1.c和testbuf2.c代码运行结果一致,因为fflush(stdout)的效果和换行符\n是一样的
3、testbuf3
estbuf3.c将内容格式化输出到标准错误、输出流中
4、testpid
testpid.c代码输出当前进程pid和当前进程的父进程的pid
5、testpp
7、testsystem
testsystem.c代码中system()——执行shell命令,也就是向dos发送一条指令。这里是后面可以跟两个参数,然后向dos发送这两个命令,分别执行
env
1、environ
getenv函数是获得环境变量值的函数,参数是环境变量名name,例如”HOME”或者”PATH”。如果环境变量存在,那么getenv函数会返回环境变量值,即value的首地址;如果环境变量不存在,那么getenv函数返回NULL
setenv函数是修改或添加环境变量的函数
2、environvar
简单打印环境变量表
fifo
1、consumer
可以通过查看文件stat结构中的stmode成员的值来判断文件是否是FIFO文件。
2、producer
mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取
pipe
1、listargs
证明了shell并不将重定向标记和文件名传递给程序
2、pipe
pipe.c引入oops,当linux系统执行代码遇到问题时,就会报告oops,运行如下
3、pipedemo
pipedemo.c展示了如何创建管道并使用管道来向自己发送数据
4、pipedemo2
pipedemo2.c说明了如何将pipe和fork结合起来,创建一对通过管道来通信的进程。在程序中显示了从键盘到进程,从进程到管道,再从管道到进程以及从进程回到终端的数据传输流
5、testtty
6、whotofile
重定向到文件
signal
1、sigactdemo
sigactdemo.c中sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号
2、sigactdemo2
sigactdemo2.c休息seconds秒后返回;或者被信号中断且信号处理函数返回后sleep()返回0。所以如果不计较返回值的话,pause()的功能相当于无限期的sleep()
3、sigdemo1
sigdemo1.c程序连续输出五个hello,每两个之间的间隔时间为2秒,且在此期间输入的Ctrl+C都被处理成打印OUCH
4、sigdemo2
sigdemo2.c一直输出haha,按Ctrl+C不能停止
看代码,这里用了一个SIG_IGN,它会忽略信号。
叫你停不下来?
5、sigdemo3.c
在read函数不发生错误的情况下输入什么,就输出什么,输入的Ctrl+C也无法终止程序,只有输入quit的时候才会退出
课后作业中的问题和解决过程
p497
习题8.3课后题中输出序列里为什么没有bcac这个情况?
反复看8.4.3的内容,我发现是我对waitpid的函数理解不够透彻,该代码第十行引用了该函数,父进程bc不可能在子进程ac开始前结束,所以bcac这种情况不可能。
p499
习题8.4第二问看不明白。
看了解答过程,又反复看这节内容,终于理解了:这里有一个wait函数,子进程还没有终止,所以内核执行上下文切换,子进程在16行终止返回状态2,父进程继续执行,第十二行打印并退出。
代码实践过程中遇到的问题及解决
我在运行testpp.c代码时出现段错误:
解决:问了别的同学,明白问题在于没给pp分配空间就调用了pp[0],在声明的时候只是一个指针,指针还要初始化。
修改代码:
代码托管
重新组织了代码结构:
代码统计:
其他(感悟、思考等,可选)
本周内容先看书,再看老师的代码会比较容易一些;把代码结构按照老师的博客要求重新组织了。内容很多仍在消化中。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第7周 | 895/1890 | 1/12 | 60/236 |