从windows过来,对fork早有耳闻,但是想理解,还是有点难度。
找来一些文章和示例代码:
http://www.wangchao.net.cn/bbsdetail_71709.html 推荐,代码还算清晰,结论明确
http://hi.baidu.com/connor/blog/item/4874d20925faa18ad1581b3d.html 有点乱,需要自己整理思路
整理一下思路:
0,fork是UNIX/linux中创建子进程的系统调用。
1,pid=fork(),是“一次调用两次返回”,分别给父进程和子进程返回结果,但是结果不同。
2,一个进程,主要包含三个元素:
o. 一个可以执行的程序;
o. 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);
o. 程序的执行上下文(execution context);
新进程和原有进程的可执行程序是同一个程序,共享代码空间;上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!这样:复制的代价比windows的复制进程代价药效;父进程的所有信息都有效的传给了子进程,而不需要像window一样传递参数,且所有数据保持一致。
3,上面最后一句话的“保持一致”是错误的,因为fork()返回的pid不一样:父进程中的pid的值是其新创建的子进程的进程id,子进程中的这个值是0。除此以为,“保持一致”是正确的。
4,新进程创建之后,从fork()的返回点开始运行,而不是从程序的最初开始运行。
4.1插一小句。wait()是等待子进程结束而进行的等待。Wait()函数的作用是挂起本进程以等待子进程的结束,子进程结束时返回。父进程创建多个子进程且已有某子进程退出时,父进程中wait()函数在第一个子进程结束时返回。
5,fork()做的是父进程的复制,注意是复制,而不是共享。就是说,父进程的信息“几乎”都给了子进程,而子进程进行的任何修改(当然是局部于进程而不是系统级别的)都不会在反应到父进程中了。
6,fork之后父子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。认为子进程结束后父进程才从fork返回的,这是不对的,fork不是这样的,vfork才这样。