Linux中关于fork()复制进程

fork()复制进程

1、fork()的基本概念

一个现有进程可以用fork()函数通过系统调用创建一个新进程,该函数定义如下:

#include <unistd.h>
pid_t fork(void);
// 返回:若成功则在子进程中返回0,在父进程中返回子进程PID,若出错则返回-1

因此,可以通过返回值知道当前进程是父进程还是子进程。


2、fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

    1)在父进程中,fork返回新创建子进程的进程ID;

    2)在子进程中,fork返回0;

    3)如果出现错误,fork返回一个负值-1;

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。


3、例:


程序的运行结果:



4、关于fork()的面试题

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

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

    exit(0);
}

问题:请问上述程序会输出几个A?

答:6个,因为加了"\n"之后不用考虑printf()函数的缓存效果,所以输出是6个。



那么,我们把程序稍微做一些改动:

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

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

    exit(0);
}

请问上述程序会输出几个A?

答:8个,因为没有加"\n"就要考虑printf()函数的缓冲区,所以是8个。




补充:父进程先打开的文件经过fork复制,在子进程中仍然可以访问,并且和父进程共享文件偏移量。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值