20145222《信息安全系统设计基础》第11周学习总结
一、教材内容总结
二、代码学习总结
1、exec1.c
- 功能:装入并运行其它程序的函数。
- 核心代码:
printf("* * * About to exec ls -l
");
execvp( "ls" , arglist );//第一个参数传递的是文件名
-
运行结果:
-
疑问:为什么没有显示最后打印的一句?
-
解答:因为在系统处理器中,在执行
execvp( "ls" , arglist );
语句时,已经将最后的打印语句覆盖掉了,处理器中并没有这句打印语句,所以最终结果如图所示。
2、exec2.c
- 功能:装入并运行其它程序的函数(与exec1相同)。
- 核心代码:
printf("* * * About to exec ls -l
");
execvp( "ls" , arglist );//第一个参数传递的是文件名
-
运行结果(与exec1的一样):
-
疑问:exec1与exec2的区别是?
-
解答:
execvp( arglist[0] , arglist ); //将文件名存放在arglist[0]中
execvp( "ls" , arglist );
即把“ls”替换成了“arglist[0]”,所以并不会影响结果。
3、forkdemo1.c
-
功能:将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1。
-
运行结果:
-
分析:从图中可以看出,After打印语句打印了两次,第一次打印的After语句是父进程执行的,因为fork函数的返回值不是0,说明是父进程在执行,第二次打印的After语句是子进程执行的,因为fork函数的返回值是0,而我的id是子进程id。
4、forkdemo2.c
-
运行结果:
-
分析:执行了两次fork函数。执行第一次,分出2个线程,执行第二次,之前的两个线程分别分出2个线程,所以一共是四个线程,最终出现4次After语句。
5、forkdemo3.c
- 运行结果:
- 分析:fork函数会将一个进程分成两个进程,并且会返回两次,所以如上图所示,我们可以看到,出现了一次“I am the parent. my child is 4954”,又出现了一次“I am the parent. my child is 4954”。这个c文件,还包括了错误处理,提高了代码的健壮性。
6、forkdemo4.c
-
运行结果:
-
分析:最后一行是10s之后才出现的! 因为sleep(10)函数,使父进程睡眠10s再执行exit(0)语句。
-
疑问:为什么要加sleep函数?
-
解答:因为,没有sleep的休眠,父进程直接执行exit(0)退出进程,出现了输入命令的提示行;而此时子进程还没有退出,之后子进程执行到exit(0)再退出,然而这次没有出现输入命令的提示行。
7、waitdemo1.c
-
功能:验证父子进程的调用顺序,测试函数sleep、wait在进程调用中的作用。
-
运行结果:
-
分析:在hildcode函数里,调用了sleep函数,这表示执行完
printf("child %d here. will sleep for %d seconds ", getpid(), delay);
语句后,系统休眠4s继续进行。
为什么这里不会让父进程继续进行?本来父子进程时并发执行的,按理说应该子进程休眠,父进程正常执行的,是因为parentcode函数里的wait_rv = wait(NULL);
代码,说明要子程序执行完毕,父进程才能继续往下进行。
8、waitdemo2.c
-
功能:在waitdemo1.c的基础上,设置了状态位。
-
运行结果:
-
分析:waitdemo2.c和waitdemo1.c最大的不同就是:设置了子进程结束后父进程的状态位。
三、学习中的疑问与解决过程
1、exec1.c中:
- 疑问:为什么没有显示最后打印的一句?
- 解答:因为在系统处理器中,在执行`execvp( "ls" , arglist );`
语句时,已经将最后的打印语句覆盖掉了,处理器中并没有这句打印语句,所以最终结果如图所示。
2、exec2.c中:
-
疑问:exec1与exec2的区别是?
-
解答:
execvp( arglist[0] , arglist ); //将文件名存放在arglist[0]中
execvp( "ls" , arglist );
即把“ls”替换成了“arglist[0]”,所以并不会影响结果。
3、forkdemo4.c中:
- 疑问:为什么要加sleep函数?
- 解答:因为,没有sleep的休眠,父进程直接执行exit(0)退出进程,出现了输入命令的提示行;而此时子进程还没有退出,之后子进程执行到exit(0)再退出,然而这次没有出现输入命令的提示行。
代码托管情况
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 2/3 | 10/20 | 掌握了几个命令 |
第二周 | 0/0 | 1/4 | 8/28 | 熟练了vim编辑器的操作 |
第三周 | 40/40 | 1/5 | 12/40 | 开始敲代码了 |
第五周 | 36/76 | 2/7 | 15/55 | 慢慢熟悉了汇编语言 |
第六周 | 12/88 | 2/9 | 16/71 | 对机器语言指令有了更深一步的理解 |
第七周 | 50/138 | 3/12 | 30/101 | 多写实用性强的博客,慢慢养成好习惯 |
第九周 | 200/338 | 2/15 | 25/126 | 理解了系统级I/O的一些基本原理 |
第十周 | 350/688 | 2/17 | 30/156 | 懂得了一些命令的具体代码原理 |
第十一周 | 450/1138 | 2/19 | 30/186 | 学习要下功夫才有趣 |