Posted on 2013-05-14 17:26
hoshelly 阅读(314)
评论(0) 编辑 收藏 引用 所属分类:
Linux
1.1
fork可以创建一个新的子进程,调用一次,返回两次,一次返回0值给子进程,另一次返回新的子进程的ID给父进程 。子进程是父进程的复制品,拥有父进程的数据空间、堆和栈,父子进程并不共享存储空间,如果正文段是只读的,那么父子进程共享正文段。一般而言,fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核的调度算法。fork有两种用法:(1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待委托者的服务请求。当这种请求到达时,父进程调用 f o r k,使子进程处理此请求。父进程则继续等待下一个服务请求。(2) 一个进程要执行一个不同的程序。这对s h e l l是常见的情况。在这种情况下,子进程在从f o r k返回后立即调用e x e c。
1.2
vfork用于创建一个新的进程,而新的进程的目的就是exec一个新程序,vfork并不将父进程的地址空间复制给子进程,因为子进程会立即调用exec(_exit),于是也就不会访问地址空间。不过它在调用exec或_exit之前,它在父进程的空间中运行。
fork创建的子进程共享父进程的数据段、堆栈段;vfork创建的子进程共享父进程的数据段。
vfork与fork的另一个区别是:vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行,(如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁)。
2.1
exit和_exit都是正常终止进程,_exit用于vfork时父进程有可能会被调度,它们都不同于异常终止abort,在异常终止情况下,内核(不是进程)产生一个指示其终止异常终止原因的终止状态。