|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
fork()函数 . w. V' T7 u, S! x6 v6 I
( S2 @! m" O8 q" w
在 Linux 中创建一个新进程的唯一方法是使用fork()函数。fork()函数是 Linux 系统中一个非常重要的函数,和咱们以前遇到过的函数由一些区别,因为它看起来执行一次却返回两个值,这又作何解释?不着急,慢慢看。7 C* c! R& C& O9 A# S9 O5 N
; `; P7 ?. Y v. Y2 w# T# h
函数说明
. Y! e* W' c, [8 j0 j* H
! V+ q& e4 b# B' P fork()函数用于从已存在的一个进程中创建一个新的进程,新进程称为子进程,而原进程称为父进程。使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
8 [% t4 }; u" c: w; @! N U; J( o. q2 k* r* L
因为子进程几乎是父进程的完全复制,所以父子进程会运行同一个程序。这就需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。% y# B% v7 H% ^& V8 ~' y3 R
" }* w- H Q4 b% E- q( P/ f6 h ] 实际上是在父进程中执行fork()函数时,父进程会复制出一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得其所属fork()函数的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判定该进程是父进程还是子进程。
+ G2 {+ l/ {" O8 K" B3 n5 B* {8 A& K ~% i- S# L- p9 c
同时可以看出,使用fork()函数的代价是很大的,它复制了父进程中的代码段、数据段和堆栈段里的大部分内容,使得 fork()函数的系统开销比较大,而且执行速度页不是很快。
, P9 P0 Q+ [7 W; g6 @6 D6 M1 \3 v g+ _5 g+ m: e' y7 V
函数语法# S6 j. p: `5 L0 t9 ^$ M k
1 T" Y8 a$ H1 V1 M" S4 l, ] T% Y8 p6 J, P& `2 v* m
6 b( d$ G2 x- E8 Y' O! G- \
5 _: T( \/ ~) i& p6 d4 L& G6 j! \ |
|