fork()函数执行过程

本文详细解析了fork()函数的工作原理,描述了如何通过fork()创建子进程,以及子进程与父进程的执行次序。讨论了时间片的影响,以及一个父进程如何创建多个子进程的情况。此外,还给出了一个实例,展示了一个父进程创建两个子进程,其中一个执行"ls -l",另一个睡眠5秒后退出,最后父进程在所有子进程结束后结束的场景。

一、fork()函数原理

int main()

{

       int pc;

       pc=fork();

}

通过fork()语句创建子进程,其实就是将父进程的内容复制到子进程中,包括堆栈段、数据段等(包括把pc的值赋给子进程,所以子进程执行的入口不再是main(),而是pc=fork()这句话,当然,fork()这句指令是不执行的,子进程将fork()返回值赋给pc。而函数的返回值默认是0,所以在不执行fork()函数的情况下,子进程的pc=0)

 

二、子进程和父进程执行次序

1、(子进程先执行的情况)如果时间片很短,在父进程执行fork()语句时,时间片就用完了,由于fork()是原语,必须先将fork()执行完毕,才能切换时间片。当fork()语句执行完毕,父进程进入就绪队列,在这之前,子进程已经进入Ready队列。在就绪队列中,父进程在子进程之后,如果这个系统的调度算法是先来先服务,子进程就会在父进程之前执行。

2、(父进程先执行的情况)如果时间片很长,当父进程执行fork()语句之后,父进程还有时间片剩余,这样的话,就是父进程先执行,子进程后执行。

三、一个父进程创建两个

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"

int main()
{
    int pc,pd;
    printf("%d\n",getpid());
    pc=fork();
    pd=fork();
    if(pc > 0 && pd > 0)
    {
        printf("this is the father! my PID = %d\n",getpid());
    }
    if(pc==0 && pd >0)
    {
        printf("this is the first child! my PID = %d\n",getpid());
    }
    if(pc > 0 && pd == 0)
    {
        printf("this is the second child! my PID = %d\n",getpid());
    }
    if(pc ==0 && pd ==0)
    {
        printf("this is the grand child! my PID = %d\n",getpid());
    }
}


如果是创建两个子进程,需要使用两个fork(),在第一个pc=fork()执行完毕之后,就有两个进程,即父进程和子进程。所以在执行第二个fork()时,就有两个进程中执行,因此,在两条fork()语句执行完毕,就有4个进程中运行。一个是父进程,两个子进程,一个孙子进程。

四、一个父进程创建两个子进程,第一个子进程执行"ls -l"指令,第二个子进程睡眠5s,之后退出,父进程在子进程都结束之后再结束。

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"

int main()
{
    int pc,pd;
    printf("%d\n",getpid());
    pc=fork();
    pd=fork();
    if(pc==0 && pd >0)
    {
        execlp("/bin/ls","/bin/ls","-l",NULL);
        exit(1);
    }
    if(pc > 0 && pd == 0)
    {
        sleep(5);
        exit(1);
    }
     if(pc > 0 && pd > 0)
    {
        printf("this is the father! my PID = %d\n",getpid());
        wait(NULL);
        exit(1);
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值