作者:SA****6450 丁海蛟
实验总结:
我们用fork()函数用来创建一个新的进程,新的进程是对当前进程的复制。新的进程又称为子进程,fork函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID,出错则返回-1。子进程是父进程的副本,子进程获得父进程数据空间、堆和栈,但是父子进程并不共享这些存储空间部分,父子进程共享正文段。
在fork()创建子进程后,子程序通常会调用 exec()函数族来执行另外一个程序,这个 exec 函数族就提供了一个在进程中启动另一个程序执行的方法。它根据指定的文件名或目录名找到可执行文件,并用它来代替当前进程的执行映像。也就是说,exec调用并没有生成新进程,一个进程一旦调用 exec函数系统把代码段替换成新程序的代码,原始进程就消失了,放弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,惟一保留的就是进程的 ID。也就是说,对系统而言,还是同一个进程,不过执行的已经是另外一个程序了。
【附录】
一、实验任务:
熟悉进程的创建和可执行程序的加载,熟悉folk()函数和exec()函数
二、实验环境:
vmware9.0 ubuntu10.04
三、实验步骤:
在vmware9.0环境下的虚拟机ubuntu10.04中打开terminal,启动gedit编辑实验代码test2.c。如图一所示。
图一
执行结果如图二所示。
图二
为了验证exec()的执行,本实验中加入了一句选择语句,在执行完父进程后,进入子进程,然后加入选择语句,如果输入为1,则正常执行子进程。如果输入为0,则执行execl("./test1","test",NULL),执行新的进程test1.结束原来的进程。
test1完成的功能只是在屏幕上打印一串字符“another procss test1”。