一、fork函数
一个现存进程调用fork函数是UNIX内核创建一个新进程的唯一方法(这并不适用于交换进程、init进程)。
--------------------------------------------------------------------------------------
#include
#include
pid_t fork(void);
--------------------------------------------------------------------------------------
由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程ID。fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程ID 0总是由交换进程使用,所以一个子进程的进程ID不可能为0)
子进程和父进程继续执行fork之后的指令。子进程是父进程的复制品。例如,子进程获得父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这些存储空间部分。如果正文段是只读的,则父、子进程共享正文段。
vfork函数
vfork函数的调用序列和返回值与fork相同,但两者的语义不同。
vfork用于创建一个新的进程,而该新进程的母的是exec一个新程序。vfork与fork一样都创建一个子进程,但是它并不讲父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不会存访该地址空间。不过在子进程调用 exec或exit之前,它在父进程的空间中运行。这种工作方式在某些unix的页式虚存实现中调高了效率。
vfork和fork之间的另一个区别是:vofork保证了子进程先运行,在它调用exec或eixt之后父进程才肯可能被调度运行。(如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁)。
阅读(1336) | 评论(0) | 转发(0) |