关于fork函数的使用与思考

Content

0.fork函数原型
1. fork函数描述
2. 关于fork函数用法的总结
3. 小结

0. fork函数原型

 #include <unistd.h>

 pid_t fork(void);

1. fork函数描述

一个现有的进程可以调用fork函数创建一个新进程;

fork函数调用一次,但返回两次,返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1;

子进程和父进程继续执行fork之后的指令。子进程是父进程的副本,子进程获取父进程的数据空间、堆和栈的副本;

2. 关于fork函数用法的总结

例1:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    printf("a");
    fork();
    return 0;
}

运行结果:aa

分析:按照fork函数调用后,子进程和父进程继续执行fork之后的指令来说,输出结果应该是1个a。出现这样的结果是因为printf函数的缓冲是行缓冲,也就是说父进程在执行了printf("a")后,字符串a依然在缓冲区中,而子进程在exit()退出时,会刷新缓冲区,所以会打印两个a。

例2:下面的程序会生成多少个子进程

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    fork();
    fork() && fork()|| fork();
    fork();
    return 0;
}

第一个fork执行后,有2个进程,一个父进程,一个子进程;

fork() && fork() || fork()分如下情况,设第一个fork为cond1,第二个fork为cond2,第三个fork为cond3

那么

1、cond1为假,那么就不判断cond2,直接执行cond3

2、cond1为真,分如下情况

      cond2为真,不判断cond3

      cond2为假,判断cond3

一共生成4个子进程

综合得出:

第一行fork生成一个子进程

第二行fork生成4x2=8个子进程

第三行fork生成(8+2)*2-1=19个子进程

例3:循环fork

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv)
{
    int i;

    for (i = 0; i < 2; i++)
    {
        fork();
        printf("a\n");
    }
    wait(NULL);
    wait(NULL);
    return 0;
}

运行结果:6个a

分析:循环两次,父进程生成两个子进程,有一个子进程会生成一个孙子进程,所以一共新创建3个子进程

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值