进程的创建
说到创建一个进程,我们首先要了解Fork这个函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
#include <unistd.h>
pid_t fork(void);
返回值:自进程中返回0,父进程返回子进程id,出错返回-1
内核中
- 分配新的内存块和内核数据结构给子进程
- 将父进程部分数据结构内容拷贝至子进程
- 添加子进程到系统列表中去
- fork返回,开始调度器的调度
fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器
决定
**
fork函数的返回值
- 子进程返回的事0
- 父进程返回的是子进程pid
fork的常规用法
- 父进程通过生成子进程来执行不同的代码段。
- 一个进程可能要执行不同的程序
fork出现的问题
fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec调用,这样,前面的拷贝工作就没有意义了。
为了解决这样一个问题 ,出现了Vfork
vfork()会产生一个新的子进程.但是vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行
fork和vfork的区别
- fork():子进程拷贝父进程的数据段,代码段.vfork():子进程与父进程共享数据段.
- fork():父子进程的执行次序不确定.,vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec 或_exit之后父进程才可能被调度运行。
- vfork()保证子进程先运行,在她调用exec或_exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。