您的位置:首页 > 编程语言

《UNIX环境高级编程》(fork和vfork)

2016-05-11 09:01 197 查看

《UNIX环境高级编程》(fork和vfork)

fork

声明



特性

调用fork可以创建一个新的进程;

fork有两个返回值:

返回0给子进程(原因是每个进程只有一个父亲,子进程可以通过getppid去得到父进程的ID,进程ID 0是预留给内核使用的,所以子进程的ID不可能是0);

返回子进程的进程ID给父进程(一个进程可以有一个或多个子进程,但是没有API可以获取子进程的进程ID);

子进程是父进程的一份拷贝,子进程会复制父进程的数据空间、堆、栈。它们之间不会共享这部分的内容,它们只会共享正文段(正文段,你可以把它理解成代码段,相当于子进程拷贝了父进程的代码);

一般来说,fork之后,是父子进程先后执行的顺序是不确定的。这个取决于内核的调度算法;

文件共享

特性

父进程所有打开的文件描述符都被复制到子进程中

fork之后常用的两种处理文件描述符的情况

父进程等待子进程完成

父子进程各自执行不同的程序段,通常用在网络服务进程中

fork失败的两个原因

系统中有太多的进程

该实际用户ID的进程总数超过了系统限制

vfork

作用

用于创建一个新的进程

特性

调用序列和返回值与fork相同;

vfork出来的子进程,不会将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),所以就需要访问地址空间。但是在子进程调用exec(或exit)之前,它在父进程的空间中运行;

vfork保证子进程先运行,当子进程执行完exec(或exit)后,父进程才会运行。但这有可能会造成死锁,比如,子进程里有依赖父进程的进一步的操作;

总结视图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unix fork vfork