???????fork()????
?????????????????????н??????????????У?????????????С??λ??????λ???????????????????У??????С??????λ??????Linux???д????????????????????????????????????????????????????????????????
?????????ú???fork()?????????????????????vfork()???????????????????????仹???????fork()??????fork()??????Linux????????????????????????ε???????????????????????fork()????????????
????#include <unistd.h>
????// On success?? The PID of the process is returned in the parent?? and 0 is returned in the child. On failure??
????// -1 is returned in the parent?? no child process is created?? and errno is set appropriately.
????pid_t fork (void);
?????????????fork()???????????????????????????????????fork()???????????????????????????????????????????????????????????????в??????Ρ????????????????????????????????????ο?????????????????????????????????????????????????????濼??????????????????????????????????????????????????д???????copy-on -write?????????????????fork()??????????????????????????????????????????????????CPU??????????????????????????Щ???????????л??????????????????????????????????д???????????????????????

??????Linux???У???????????????????????fork()????н????????????????ЩС?鷳???????????????????????????????????????????????????ζ?????????????????????????????????????Щ??????????????????dup()?????????????????????ж???????????????????????????????????????????????????????????????????????????????????????????д???????????????????????????????????????????????????????fork()???ú?????????????????????仯??

???????????
??????????????????thread??????????ó???????ж??????????????????????п??????????????????????е????????????????У???????????????????????а????????????Σ?initialized data????δ?????????Σ?uninitialized data????????????Σ?heap segment????????????????£??????????????У???????????????CPU?????????????????????????????????????????Щ??????????????????????????????????????
?????????У???????????????????????????????????????????????????С?????????????????????????????ж??????????????CPU???????????г???????????????t???滮????????????????????CPU??????????ù?????????????????????????????????????????????????????????????????????????????????????????滮????????????????????????У???????????????????????????ж?????????????Щ????????????????????????main()?????????е?????????????????????????????????????????????main()???????????????????????????δ???????????
????????fork()??????
???????????fork()???????Э??????????POSIX??в???????????????????????????????????????fork()???????????20????90?????????????????fork()?????÷?Χ?????С???
????????????е?????μ???fork()???????????????????????????????С?????????и?????ID???????з???fork()????????ID???????????????ID?????????????????????????????????????????????????????????????????????????????????????????????????????????????Щ?????????????????????????洢???????????????????????????Щ????:
????1. ??????????fork()??????????????????У???????????????????е?pthreads?????綏?????????????????????????????е???????????????Σ?????檔???磺????????fork()??????????????????????????????????????????????????????fork()????????????????????????????????У??????????ж???????????????????????????????????????????????????????????????????????????????в??????????????????????????????????????μ??????????????μ???????????????????????????fork()?????????????????????????signal handler??У??????????????????????????????????????????????????????????????????????????????async-signal-safe?????????fork()???????????????
????· malloc(3)?????malloc()??????????????????
????· ?κο???????????????????????new??map::insert()??snprintf() ……
????· ?κ?pthreads????????????pthread_cond_signal()??????????????????дpipe(2)???????
????· printf()??к????????????????????ó???stdout/stderr??????
????· ????man 7 signal??????г???“signal???”?????????κκ?????
????2. ?????δ?????????????????????洢???????????????????????????????????????????й?????????????е??????????????????????У????????????????????????洢?????????????????????κ?????????????
??????????Щ?????????????????е???fork()???????????????????exec()?????????????????????????????????????????μ??????????е???棬?????????е?????pthreads?????????
??????????Щ???????fork()???????????exec()????????????????pthreads API???????????fork()????????????ú???pthread_atfork()??????fork()?????????pthread_atfork()???????£?
????#include <pthread.h>
????// Upon successful completion?? pthread_atfork() shall return a value of zero; otherwise?? an error number shall be returned to indicate the error.
????// @prepare ????????????????
????// @parent  ???????????????????????
????// @child    ???????????????????????
????int pthread_atfork (void (*prepare) (void)?? void (*parent) (void)?? void (*child) (void));
?????ú??????????????????????????????????????????ε?????????????????????????????????????м????????????????????????????ε???pthread_atfork()??????prepare????????????б??У????????????????????????????????????иú????б??к?????parent??child???????????????б??У???fork()?????????????????????????У??????????????????????ο???http://blog.chinaunix.net/uid-26885237-id-3210394.html
??????????
????fork()????????????????????г??????????????????????????в?????????????????????????????????й????????????ж????????????????fork()??????????????????main?????????????????????????????????????????????????????????????????????л????????????????????????????????л??????????????????????????????δ?????????????м????????????????????????????????3?????????????С?