赞
踩
这是咱们操做系统课的一个实验linux
1、实验目的:
加深对进程概念的理解,明确进程和程序的区别。进一步认识并发执行的实质。
认识进程生成的过程,学会使用fork生成子进程,并知道如何使子进程完成与父进程不一样的工做。
2、实验要求:
进行Linux(可选)下的建立进程实验并提供截图和源代码web
3、实验准备
首先学习了一下fork()的用法和特色,这几点是要注意的:并发
一、进程能够看作程序的一次执行过程。在linux下,每一个进程有惟一的PID标识进程。PID是一个从1到32768的正整数,其中1通常是特殊进程init,其它进程从2开始依次编号。当用完32768后,从2从新开始。
二、进程在linux中呈树状结构,init为根节点,其它进程均有父进程,某进程的父进程就是启动这个进程的进程,这个进程叫作父进程的子进程。
三、fork的做用是复制一个与当前进程同样的进程。新进程的全部数据(变量、环境变量、程序计数器等)数值都和原进程一致,可是是一个全新的进程,并做为原进程的子进程。svg
还有就是关于fork()的返回值,fork调用的一个奇妙之处就是它仅仅被调用一次,却可以返回两次,它可能有三种不一样的返回值:函数
1)在父进程中,fork返回新建立子进程的进程ID;
2)在子进程中,fork返回0;
3)若是出现错误,fork返回一个负值;学习
这不是咱们课的代码,我为了更加容易理解作了修改,
主要是在最后一行多加了一句间接打印出当前进程状态的语句
这里的getpid()是获取当前进程的PID标识(这是惟一能肯定该进程的标识符)this
4、实验结果
先来看这段代码
#include
#include
#include
int main(){
int pid1 = fork();
printf("**1**\n");
int pid2 = fork();
printf("**2**\n");
if(pid1 == 0){
int pid3 = fork();
printf("**3**\n");
}
else
printf("**4**\n");
printf("------this id: %d , pid1: %d , pid2: %d \n",getpid(), pid1, pid2);
return 0;
}
先把程序分红三个部分,分别对应三个printf * 的语句
结果直接贴出来,是这样的
操作系统
很明显,一共建立了五个进程,PID分别为8420,8421,8422,8423,8424,8425
下面来分析一下它们具体的状况3d
对于8420
首先对最开始的主进程分析,由输出能够知道主进程的pid是8420,它执行了整个代码,因此由该进程输出的是
而后又因为8420建立了两个进程,第一个fork建立的进程的pid是8421
第二个fork建立的是8422,由于pid1的值为8421,因此没有进入if语句,也就没有第三个fork。code
对于8421
它是有8420的第一个fork语句获得的,而后它复制了父进程的一切状态,并从建立该进程的fork语句开始执行代码(即第一个fork语句)
注意:虽然8421获得了父进程8420的pid1的值,可是因为第一个fork语句让8421的pid置为零,这是fork函数返回值的特性
而后在第二个fork语句建立了新进程8423
由于pid1为0,因此在进入第三个fork语句,建立了新进程8424
对于8422
它是有8420的第二个fork语句获得的,同理就获得了8420的pid1和pid2,可是由于pid2是建立该进程的fork返回值,因此pid2置为0
由于这个进程从第二个fork语句执行,因此第一个printf语句没有输出
由于pid1不是零因此也没有第三个fork语句,输出4就退出了
对于8423
它是有8421的第二个fork语句获得的
因而获得了8421的pid1和pid2
可是由于pid2是建立该进程的fork返回值,因此pid2置为0
由于这个进程从第二个fork语句执行,因此第一个printf语句没有输出
由于pid1为0,因此有第三个fork语句建立了一个新的进程8425并输出3
对于8424
它是有8421的第三个fork语句获得的
因而获得了8421的pid1和pid2,注意这时的pid2还不是零
由于这个进程从第三个fork语句执行,因此只有一个输出3
对于8425
它是有8423的第三个fork语句获得的
因而获得了8423的pid1和pid2,均为零
由于这个进程从第三个fork语句执行,因此也只有一个输出3
最后咱们再来整理一些这些进程的关系
发现结果的输出也就是表明着进程的执行顺序是不定的,并非父进程就必定比子进程快,应该是根据进程调度程序的控制决定的!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。