天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

fork 和 vfork 的区别 & exit 和_exit的区别

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,在异常终止情况下,内核(不是进程)产生一个指示其终止异常终止原因的终止状态。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理