Linux-4 fork

fork()

一、什么是fork

fork()是将当前进程复制一份生成一个子进程,被复制的进程叫做父进程,复制得来的进程叫做子进程,父子除过返回值不同之外,其他的所有都相同。
在父进程中,fork()的返回值是子进程的id号,在子进程中,fork()的返回值为0。
fork()的作用是复制进程(或者说创建进程)。

man fork

在这里插入图片描述
通过查看fork的文件之后,发现fork的作用是创建一个进程,fork的头文件是 unistd.h ,fork是无参的,其返回类型是pid。
补充一点:在Linux中,要产生一个新的进程分两步走,fork+exec。即先通过fork复制,然后再通过exec替换。这里只讲fork,exec在后面会提到。

二、实列

2.1 例1

通过一个实列来看fork:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<unistd.h>

int main()
{
        int n =0;
        char *s = NULL;
        pid_t pid = fork();
        assert(pid!=-1);

        if(pid==0)
        {
                n=3;
                s="child";
        }
        else
        {
                n=7;
                s="parent";
        }
        int i=0;
        for(;i<n;++i)
        {
                printf("s=%s",s);
                sleep(1);
        }
        exit(0);
}

分析:

当父进程执行到fork()的时候,复制出子进程。因为父进程中,fork的返回值为子进程的id,所以父进程中n=7;子进程中,fork的返回值为0,所以,子进程中n=3,又因为在fork完成以后,默认父子进程是并发(同时进行)执行的,父子进程相互不影响(子进程的结束不会影响到父进程),所以父子进程一起执行,当子进程执行到n=3的时候,子进程结束,父进程继续进行,直到父进程执行到n=7结束进程。

通过gcc编译之后,运行代码发现结果为:
在这里插入图片描述

图解:
在这里插入图片描述
注意:在父进程执行过的fork,子进程中会从fork后面的位置开始执行
为了进一步观察父子进程的id号,将代码改一下:

int n =0;
        char *s = NULL;
        pid_t pid = fork();
        assert(pid!=-1);

        if(pid==0)
        {
                n=3;
                s="child";
        }
        else
        {
                n=7;
                s="parent";
        }
        int i=0;
        for(;i<n;++i)
        {
                printf("s=%s,curr_pid=%d,ppid=%d\n",s,getpid(),getppid());
                sleep(1);
        }

执行结果:
在这里插入图片描述
可以看到子进程的id为3159,父进程的id为3158。
子进程的id大于父进程的id

2.2 例2

int main()
{
        int i=0;
        for(;i<2;++i)
        {
                fork();
                printf("A\n");
        }
        exit(0);
}

分析:

在这里插入图片描述
运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值