关于操作系统fork()函数详解

Hello!fork( )

对于操作系统的fork()函数,我也是在学操作系统时第一次接触,做实验时对这个函数的功能也是很懵,后期经过学习、实验才将这个函数拿下。

fork基础

  1. fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。
  2. c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程。此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码。
  3. 子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:代表父进程的值是一串数字,这串数字是子进程的ID(地址);一个代表子进程,值为0。而当执行fork ()函数出现错误时,则返回一个负值。

fork函数演示

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
	int p1;
	p1=fork();//子进程创建成功后与父进程一起向下执行
	sleep(3);//延迟3秒测试父进程与子进程是否有竞争
	printf("%d\n",p1);
}

结果如下:父进程中返回子进程的ID号,子进程返回0
在这里插入图片描述我们发现ID号和0的输出先后顺序是不同的,这也说明进程之间的并发执行,两进程之间存在竞争。
我们再来看两个例子:

#include<stdio.h>
#include<unistd.h>
int main()
{
	int pid,i;
	for(i=0;i<7;i++)
	{
	if(pid=fork())//当返回值非空或非0时执行下面的语句
	{
	printf("%d %d\n",pid,i);
	break;
	}
	}
}

执行结果:
在这里插入图片描述当fork()执行成功,随即创建一个子进程,父进程中fork返回子进程id号并输出,父进程break之后死亡,子进程中首先返回0(并不会执行输出与break语句)接着子进程进入下一个循环并执行fork创建其子进程然后输出,break…

#include<unistd.h>
#include<stdio.h>
int main()
{
        int p1,p2;
        if(p1=fork())               /*子进程创建成功*/
                //父进程返回子进程ID,满足条件,执行下面语句
           putchar('b');//首先输出b,之后父进程死亡
        else   //子进程的fork为0,子进程在这里面执行
        {
                if(p2=fork())       //在这里子进程创建了自己的子进程,此时子进程fork返回孙进程的ID>1,执行下面语句
                   putchar('c');//子进程执行,输出c
                else
                   putchar('a');           /*子进程的子进程执行*/
        }
printf("\n");
}

执行结果:(注意!顺序是不固定的!)
在这里插入图片描述

父进程
子进程
输出a
子进程的子进程
输出b
输出c

END

在这里插入图片描述

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值