基于toyix的进程和轻权进程的学习(5)

虽然frkfork创建的子进程都不与父进程共享代码段,但是父子进程代码段的内容都是一样的,怎么让子进程的代码段的内容与父进程不一样呢?我们可以用exec函数,它的功能是执行一个可执行文件,创建一个进程覆盖当前的进程,这样我们就可以在生成的子进程中创建一个新的进程,而这个新的进程可以执行与父进程完全不同的功能。如下,编写程序1为:

基于toyix的进程和轻权进程的学习

程序2为:

执行结果为:

程序中子进程在执行exec函数后被新建的2.prg的进程所覆盖,从而执行2.prg的内容,这样就可以使进程1的子进程运行时启动2.prg的进程了。

如果把exec放到父进程里面会怎么样呢?

基于toyix的进程和轻权进程的学习

执行结果如下:

父进程被覆盖了,那么再把fork换成frk试试看:

基于toyix的进程和轻权进程的学习

执行结果如下:

只执行了主进程的内容,这是因为frk的父进程在结束时会撤销轻权进程,这是因为主进程和轻权进程共享一个数据段,主进程结束后会释放数据段,如果这时轻权进程还存在的话,就会继续使用数据段,但是这时数据段已经被释放了,可能内存空间已经被别的程序使用,如果继续使用会出错,所以必须要撤销轻权进程。但是如果我们在主进程里添加延时函数或者输入函数,等到轻权进程执行,就可以达到之前程序的结果。

那么如果exec是在轻权进程中执行,它所创建的进程还是轻权进程吗?Exec函数是执行一个完全不同的程序,那么这个程序的数据段肯定与当前程序不同,即新的进程不与主进程共享数据段,那么它就不是一个轻权进程。所以我们在轻权进程中用exec创建的进程是一个普通进程而不是轻权进程。我们可以实现程序来证明:

程序1为:

基于toyix的进程和轻权进程的学习

程序2为:

基于toyix的进程和轻权进程的学习

执行结果为:

结果发现在执行2.prg的过程中,也就是输出a的过程中我们按回车结束主进程,但是此时还是在继续输出a,这说明当主进程结束后,exec创建的进程并没有被撤销,而是继续执行。这说明exec创建的不是轻权进程。

那么如果exec函数在主进程中,能够用新创建的进程覆盖主进程吗?我们将程序1修改为如下:

基于toyix的进程和轻权进程的学习

执行结果为:

可见exec并没有创建执行新的进程,主进程也没有被覆盖。查看函数手册发现exec如果执行失败了exec会返回-1.printf函数打印exec的值,发现果然是-1

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/26974be0ecc82c69b54cff0f7be50720.html