fork函数

fork函数

        在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新的进程。新进程为子进程,而原进程为父进程。

#include<unistd.h>
pid_t fork(void);
//返回值:子进程返回0,父进程
//中返回子进程的,出错返回-1

fork函数的返回值

        子进程返回0;

        父进程返回的是子进程的pid。

写时拷贝

        通常,父子进程代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自 一份副本。


fork常规用法

         一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。

        一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。

fork调用失败的原因

        系统中有太多的进程

        实际用户的进程数超过了限制

vfork函数

        也是用来创建子进程,但是

         vfork用来创建一个子进程,而子进程和父进程共享地址空间,fork的子进程具有独立地址空间

        vfork保证子进程先运行,在它调用exec或(exit)之后父进程才开始被调度执行

fork相关程序

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

int main(){
    pid_t pid;
    printf("before pid id %d\n",getpid());
    if((pid = fork()) == -1){
        perror("fork");
        return -1;
    }
    printf("after pid is %d;fork return %d\n",getpid(),pid);
    sleep(1);//等待父子进程都结束后再退出
    return 0;
}
//这里可以看到三行输出,一行before,两行after。进程先打印before,
//当fork之后,父子两个执行流分别执行。
//注意:fork之后,谁先执行完全由调度器决定。

vfork相关程序

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int value = 100;

int main(){
    pid_t pid;
    if((pid = vfork())== -1){
        perror("fork");
        return 1;
    }
    if(pid == 0){
        //child
        sleep(3);
        value = 200;
        printf("child value = %d\n",value);
        exit(0);
    }else {
        //parent
        printf("parent value = %d\n",value);
    }
    return 0;
}
//等待3秒之后,子进程先输出value值,然后父进程才输出value值
//value值均为200,可见子进程直接改变了父进程的变量值,因为
//子进程在父进程的地址空间中运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值