信息安全系统设计基础第十二周学习总结 实践

一、实践代码总结

1. execvp()函数

函数说明:execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。 返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

exec1.c:

信息安全系统设计基础第十二周学习总结
实践

(源代码中第二个printf语句消失了,原因是调用execvp函数时,内核将新程序载入到当前进程,替代当前进程的代码和数据。)

exec2.c:

信息安全系统设计基础第十二周学习总结
实践

(exec2与exec1的区别就在于,execvp函数调用的语句变成了

execvp( arglist[0] , arglist );

编译运行结果与exec1.c完全相同,说明arglist数组的第一项为要运行的程序的名称。)

exec3.c:

信息安全系统设计基础第十二周学习总结
实践

2. fork()函数

函数说明:在Unix/Linux中用fork函数创建一个新的进程。进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程。该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程。两次返回的区别是子进程的返回值为0,父进程的返回值是新子进程的ID。子进程与父进程继续并发运行。如果父进程继续创建更多的子进程,子进程之间是兄弟关系,同样子进程也可以创建自己的子进程,这样可以建立起定义关系的进程之间的一种层次关系。

调用fork函数之后内核的工作过程:

  • 分配新的内存块和内核数据结构
  • 复制原来的进程到新的进程
  • 向运行进程集添加新的进程
  • 将控制返回给两个进程

forkdemo1.c:

信息安全系统设计基础第十二周学习总结
实践

forkdemo2.c:

(子进程不是从main函数开始,而是从fork返回的地方开始被创建)

信息安全系统设计基础第十二周学习总结
实践

forkdemo3.c:

信息安全系统设计基础第十二周学习总结
实践

forkdemo4.c:

信息安全系统设计基础第十二周学习总结
实践

forkgdb.c:

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践

psh1.c:

1.psh1.c是Unix shell的第一个方案,要求每个字符串单独输入,第一个是程序名,然后依次是程序参数。

2.代码部分

  • 一个字符串,一个字符串构造参数列表argist,最后在数组末尾加上NULL;
  • 将arglist[0]和arglist数组传给execvp。

3.程序正常运行,execvp命令指定的程序代码覆盖了shell程序代码,并在命令结束之后退出,shell就不能再接受新的命令。

信息安全系统设计基础第十二周学习总结
实践

psh2.c:

信息安全系统设计基础第十二周学习总结
实践

testbuf1.c:

信息安全系统设计基础第十二周学习总结
实践

testbuf2.c:

信息安全系统设计基础第十二周学习总结
实践

testbuf3.c:

信息安全系统设计基础第十二周学习总结
实践

testpid.c:

信息安全系统设计基础第十二周学习总结
实践

testpp.c:

信息安全系统设计基础第十二周学习总结
实践

testsystem.c:

信息安全系统设计基础第十二周学习总结
实践

waitdemo1.c:

进程通过调用wait函数等待子进程的退出。wait首先暂停调用它的进程直到子进程结束,然后wait取得子进程结束时传给exit的值。

waitdemo1.c显示了子进程调用exit触发wait返回父进程的过程。

信息安全系统设计基础第十二周学习总结
实践

waitdemo2.c:

wait的两个重要特征:

  • wait阻塞调用它的程序直到子进程结束
  • wait返回结束进程的PID

waitdemo2.c显示了wait函数告诉父进程子进程是如何结束的,通过传递给wait的参数。父进程调用wait时传一个整型变量地址给函数,内核将子进程的退出状态保存在这个变量之中。

信息安全系统设计基础第十二周学习总结
实践

(实践的主要目的还是自己理解、运行代码。篇幅有限,就不在此一一列出运行结果了。)

二、视频知识点总结

(一)进程间通信

1. Linux下的各种进程间通信方式包括:管道、命名管道、消息队列、共享内存、信号量。

2. 管道的概念

调用pipe来创建管道并将其两端连接到两个文件描述符,array[0]为读数据端的文件描述符,而array[1]则为写数据端的文件描述符,内部则隐藏在内核中,进程只能看到两个文件描述符。

信息安全系统设计基础第十二周学习总结
实践

3. 管道的创建与关闭

  使用pipe函数创建一个匿名管道。

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践

4. 管道的读写

  当对管道进行读写操作时,使用read和write函数。

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践

  例子:

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践5. 命名管道的概念

信息安全系统设计基础第十二周学习总结
实践

6. 命名管道的创建

信息安全系统设计基础第十二周学习总结
实践

例子:

信息安全系统设计基础第十二周学习总结
实践

编译、运行结果:

信息安全系统设计基础第十二周学习总结
实践

7. 命名管道的读写

信息安全系统设计基础第十二周学习总结
实践

例子:

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践

编译、运行结果:

信息安全系统设计基础第十二周学习总结
实践

信息安全系统设计基础第十二周学习总结
实践

三、实践感想

本次实践主要是完成第八章的代码的阅读、编译和运行,还有有关进程视频的学习。本篇学习总结因篇幅有限,并没有将全部代码、视频内容写在博客里。不过通过本周学习我进一步了解到fork函数、execvp函数、wait函数的使用方法和管道的创建、关闭与读写,对于进程间通信和进程控制有了更深刻的理解。不过对于argv文件夹内需要将makeargv.c和freemakeargv.c制作成静态库后运行argtest.c这个问题我还不甚清楚。

四、参考资料

  • 《深入理解计算机系统》
  • 《嵌入式Linux应用程序开发标准教程》
  • 《[Unix-Linux编程实践教程].Understanding.UNIX_LINUX.Programming》