操作系统概念Linux下⽤C语⾔fork()函数创建进程的实验及解释
这是我们操作系统课的⼀个实验
⼀、实验⽬的:
1. 加深对进程概念的理解,明确进程和程序的区别。进⼀步认识并发执⾏的实质。
2. 认识进程⽣成的过程,学会使⽤fork⽣成⼦进程,并知道如何使⼦进程完成与⽗进程不同的⼯作。
⼆、实验要求:createprocessa
进⾏Linux(可选)下的创建进程实验并提供截图和源代码
三、实验准备
⾸先学习了⼀下fork()的⽤法和特点,这⼏点是要注意的:
1、进程可以看做程序的⼀次执⾏过程。在linux下,每个进程有唯⼀的PID标识进程。PID是⼀个从1到32768的正整数,其中1⼀般
是特殊进程init,其它进程从2开始依次编号。当⽤完32768后,从2重新开始。
2、进程在linux中呈树状结构,init为根节点,其它进程均有⽗进程,某进程的⽗进程就是启动这个进程的进程,这个进程叫做⽗进程
的⼦进程。
3、fork的作⽤是复制⼀个与当前进程⼀样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程⼀致,但是
是⼀个全新的进程,并作为原进程的⼦进程。
还有就是关于fork()的返回值,fork调⽤的⼀个奇妙之处就是它仅仅被调⽤⼀次,却能够返回两次,它可能有三种不同的返回值:
1)在⽗进程中,fork返回新创建⼦进程的进程ID;
2)在⼦进程中,fork返回0;
3)如果出现错误,fork返回⼀个负值;
这不是我们课的代码,我为了更加容易理解做了修改,
主要是在最后⼀⾏多加了⼀句间接打印出当前进程状态的语句
这⾥的getpid()是获取当前进程的PID标识(这是唯⼀能确定该进程的标识符)
四、实验结果
先来看这段代码
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
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
下⾯来分析⼀下它们具体的情况
对于8420
⾸先对最开始的主进程分析,由输出可以知道主进程的pid是8420,它执⾏了整个代码,所以由该进程输出的是
然后⼜由于8420创建了两个进程,第⼀个fork创建的进程的pid是8421
第⼆个fork创建的是8422,因为pid1的值为8421,所以没有进⼊if语句,也就没有第三个fork。
对于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
最后我们再来整理⼀些这些进程的关系
发现结果的输出也就是代表着进程的执⾏顺序是不定的,并不是⽗进程就⼀定⽐⼦进程快,应该是根据进程调度程序的控制决定的!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论