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


    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 学习要下功夫才有趣
  • 相关阅读:
    uIP的ARP协议分析
    如何使函数不生成执行代码
    计算机网络基础
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
  • 原文地址:https://www.cnblogs.com/huangyaqi/p/6106772.html
Copyright © 2020-2023  润新知