linux下C语言fork(),操做系统概念Linux下用 C语言 fork()函数建立进程的实验及解释...

这是咱们操做系统课的一个实验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 * 的语句

结果直接贴出来,是这样的

de5f8ff51fa4ff0f3de887cb813a88d0.png操作系统

很明显,一共建立了五个进程,PID分别为8420,8421,8422,8423,8424,8425

下面来分析一下它们具体的状况3d

对于8420

首先对最开始的主进程分析,由输出能够知道主进程的pid是8420,它执行了整个代码,因此由该进程输出的是

1b8af7f792f344ebd54d9a4886052b77.png

而后又因为8420建立了两个进程,第一个fork建立的进程的pid是8421

第二个fork建立的是8422,由于pid1的值为8421,因此没有进入if语句,也就没有第三个fork。code

对于8421

它是有8420的第一个fork语句获得的,而后它复制了父进程的一切状态,并从建立该进程的fork语句开始执行代码(即第一个fork语句)

注意:虽然8421获得了父进程8420的pid1的值,可是因为第一个fork语句让8421的pid置为零,这是fork函数返回值的特性

ca377f53aeb55b1a4ee7d88ef36c5c5f.png

而后在第二个fork语句建立了新进程8423

由于pid1为0,因此在进入第三个fork语句,建立了新进程8424

对于8422

它是有8420的第二个fork语句获得的,同理就获得了8420的pid1和pid2,可是由于pid2是建立该进程的fork返回值,因此pid2置为0

f562ca2d6ecc74415f1eade4a02e8a8d.png

由于这个进程从第二个fork语句执行,因此第一个printf语句没有输出

由于pid1不是零因此也没有第三个fork语句,输出4就退出了

对于8423

它是有8421的第二个fork语句获得的

因而获得了8421的pid1和pid2

可是由于pid2是建立该进程的fork返回值,因此pid2置为0

d9669473a401cff19edd7218dff80ba1.png

由于这个进程从第二个fork语句执行,因此第一个printf语句没有输出

由于pid1为0,因此有第三个fork语句建立了一个新的进程8425并输出3

对于8424

它是有8421的第三个fork语句获得的

因而获得了8421的pid1和pid2,注意这时的pid2还不是零

07ded1fbceb358fc4d9568def79fc119.png

由于这个进程从第三个fork语句执行,因此只有一个输出3

对于8425

它是有8423的第三个fork语句获得的

因而获得了8423的pid1和pid2,均为零

1862c9e56a1e299799c0c0e82c91386e.png

由于这个进程从第三个fork语句执行,因此也只有一个输出3

最后咱们再来整理一些这些进程的关系

ae483ab389b016917bbffabf7be52eff.png

发现结果的输出也就是表明着进程的执行顺序是不定的,并非父进程就必定比子进程快,应该是根据进程调度程序的控制决定的!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值