进程控制-进程创建(fork、vfork)

现在我们有了进程的概念,我们就要开始创建进程了。
那么用户怎么在当前进程下创建新的进程呢?
系统提供三个系统调用fork()、vfork()、clone()。
系统调用fork()是建立进程的最基本操作,它是把Linux变换为多任务系统的基础。
1. fork()
头文件:usistd.h
声明:pid_t fork(void);
返回值:子进程中返回0,父进程中返回子进程ID,调用失败返回-1。
fork()用于根据已存在的进程“复制”出一个新的进程。
fork调用示意图:
这里写图片描述
调用fork()时,fork()将父进程的资源,通过数据结构的“复制”传递给子进程。包括task_sutuct中的内容。
fork()创建的进程,父子进程共享代码段,复制数据段和堆栈段,这里的复制是著名的写时拷贝(Copy on write)技术,也就是说一旦fork()创建成功后,父进程与子进程地址空间已经分开,两者已经独立运行。因此不会相互影响。
当然子进程也不是完全复制父进程,还有少量信息不同,例如:进程的标识、状态等。
运用实例:

#include<stdio.h>
#include<unistd.h>
int main()
{
    printf("no fork()\n");
    int id=fork();
    if(id==0)//child
    {
        printf("This is child.pid:%d ppid:%d\n",getpid(),getppid());
    }
    else if(id>0)//father
    {
        wait(NULL);
        printf("This is father.pid:%d ppid:%d\n",getpid(),getppid());
    }
    else
    {
    printf("error!");
    }
    return 0;
}

结果:
这里写图片描述
可以看到我们通过fork()返回值,来让父子进程进行不同的工作。另外,一般来说fork()之后父进程和子进程的执行顺序是不确定的,这取决于调度器。上面程序是父进程wait子进程执行再执行。
文件共享
fork的⼀个特性是⽗进程的所有打开⽂件描述符都被复制到⼦进程中。⽗⼦进程的每个相同的打开描述符共享⼀个⽂件表项。
重要的一点,父进程和子进程共享一个文件偏移量。
这里写图片描述
⽗⼦进程之间的区别:
1)fork的返回值
2)进程ID不同
3)具有不同的⽗进程ID
4)⼦进程的tms_utime、tms_stime、tms_cutime及tms_ustime均被设置为0
5)⽗进程设置的⽂件锁不会被⼦进程继承
6)⼦进程的未处理闹钟被清除
7)⼦进程的未处理信号集被设置为空集
fork有下⾯两种⽤法:
1)⼀个⽗进程希望复制⾃⼰,使⽗⼦进程同时执⾏不同的代码段。例如,⽗进程等待客户端请求,⽣成⼦进程来处理请求。
2)⼀个进程要执⾏⼀个不同的程序。例如⼦进程从fork返回后,调⽤exec函数。
2. vfork()
为什么要有vfork呢?
    首先我们想想,假设我们fork创建一个子进程后,产生一个父进程的副本,然后调用一个exec执行一个新的代码段,这样一个新程序替换了当前进程的正文、数据、堆栈段,这样前面的拷贝作岂不是没有了意义?于是就出现了vfork。
vfork⽤于创建⼀个新进程,⽽该新进程的⽬的是exec⼀个新程序。vfork与fork都创建⼀个⼦进程,但它不将⽗进程的地址空间复制到⼦进程中,因为⼦进程会⽴即调⽤exec,于是不会存放该地址空间。相反, 在⼦进程调⽤exec或exit之前(如果调用这两个函数这两个函数之前子进程依赖父进程的进一步动作,则会导致死锁),它在⽗进程的空间中运⾏,也就是说会更改⽗进程的数据段、栈和堆中运行。

    vfork与fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用 exec (或exit ),不过在子进程调用 exec或exit之前,它在父进程的空间中运行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值