操作系统实验2——进程控制

 

(一) 实验目的

通过fork(),exec(),exit()函数了解进程控制的特点

(二) 实验内容和要求

1)了解系统调用fork(), exex(), exit()等功能和实现过程;

2)编写一段程序,使用系统调用fork()来创建两个子进程。

(三) 主要仪器设备

仪器: PC

实验环境:Linux

(四) 实验原理

画程序的流程图或N-S图。

(五) 源程序

osexp2.c:

 

Osexp24.c

 

 Osexp25.c

 

Osexp26.c

 

(六) 实验步骤与调试

a)      fork()函数:

 

41954->41955

b)      exec()函数:

 

scanf(“%d”,&a)使得可以方便查看进程情况

 

 

c)       exit()函数:

 

利用sacnf作断点,查看进程信息,可见父进程43460,子进程43461

 

 

d)      创建两个子进程:

osexp26.out

 

(七) 实验结果与分析

a)      fork()函数:

b)      exec()函数:

exec系列中的系统调用都完成相同的功能(只是参数不同而已),它们把一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,从而形成新进程。如果exec调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新的进程,但是它的进程标识符与调用进程相同。这就是说,exec没有建立一个与调用进程并发的新进程,而是用新进程取代了原来的进程。所以,在exec调用成功后,没有任何数据返回,这与fork()不同。

由图可知:子进程(父进程为42952,子进程为43953)由于执行了exec(),所以被新程序[echo] <defunct>给代替了,新进程的进程标识符与调用进程相同。于是没有在Step 2后显示pid=xxxxx,

c)       exit()函数:

直接是进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构。

由图可知:利用sacnf作断点,查看进程信息,可见父进程43460,子进程43461。在父进程中执行了exit(),所以父进程被销毁了,由于子进程从属与父进程的关系,子进程也跟着销毁了,于是pid<0,打印Error.

d)      进程控制:

由图可知:在循环中创建了两个子进程:43189(bash)->43689(father)->43690(child1)->43691(child2).

e)       本实验中进程所体现的两个重要特点:

           i. 子进程共享父进程的资源,当父进程销毁时,子进程也跟着消失

           ii.  父进程与子进程之间以类似于链表的形式关联在一起,所以进程ID从父进程开始以1递增

 

 

 参考文章:

Linux中fork()函数详解:https://www.cnblogs.com/dongguolei/p/8086346.html

linux c语言 fork() 和 exec 函数的简介和用法:https://www.cnblogs.com/dongguolei/p/8098181.html

fork()函数详解:https://blog.csdn.net/u014082714/article/details/45031771

exec系列系统调用:http://blog.chinaunix.net/uid-21765995-id-1815602.html

 

猜你喜欢

转载自www.cnblogs.com/liulangbxc/p/12806237.html