20145222《信息安全系统设计基础》第11周学习总结

20145222《信息安全系统设计基础》第11周学习总结

一、教材内容总结

第八章 异常控制流

二、代码学习总结

1、exec1.c

  • 功能:装入并运行其它程序的函数。
  • 核心代码:
		printf("* * * About to exec ls -l\n");	    
		execvp( "ls" , arglist );//第一个参数传递的是文件名
  • 运行结果:

  • 疑问:为什么没有显示最后打印的一句?

  • 解答:因为在系统处理器中,在执行execvp( "ls" , arglist );语句时,已经将最后的打印语句覆盖掉了,处理器中并没有这句打印语句,所以最终结果如图所示。

2、exec2.c

  • 功能:装入并运行其它程序的函数(与exec1相同)。
  • 核心代码:
		printf("* * * About to exec ls -l\n");	    
		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\n", 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 学习要下功夫才有趣
posted @ 2016-11-27 21:39  20145222黄亚奇  阅读(249)  评论(4编辑  收藏  举报