fork函数细究

来源:互联网 发布:弘化社淘宝官方流通处 编辑:程序博客网 时间:2024/05/22 08:15
 fork后的父子进程特点: 
 1.子进程是父进程的一个拷贝子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存的方式访问,),为了提高效率,现在通常使用写时拷效率贝技术来提高xiao'lü。即: 这些区域由父子进程共享,而且内核将他们的访问权限变为只读的,如果父子进程中的任何一个试图修改这些区域,则内核只为修改区域的那块内存制作一个副本。
 2.父进程与子进程的不同之处在于: 返回值不同:给父进程返回的是子进程的pid,给子进程返回的是0
 3.fork返回后,子进程和父进程都从调用fork函数的下一条语句开始执行:条件判断是用来执行各自进程所需要的操作,但若没有条件判断或条件判断结束 父子进程仍然需要分别执行fork后的代码。
 4.fork的一个特性是父进程的所有打开文件描述符都被复制到子进程中,父子进程的每个相同的文件描述符共享一个文件表项。要想使子进程和父进程同时重定向到某一个文件,则重定向的操作必须在fork之前:因为子进程是父进程的一份拷贝。

特点第四条证明:

一:重定向操作放在fork之前
现象:
          标准输出不能输出数据,父子进程的数据都被重定向到fork文件中


二: 重定向放在fork之后

现象:
     子进程的标准输出没有重定向成功,屏幕上输出了子进程的pid和ppid,父进程的标准输出重定向成功,父进程的数据被重定向到fork文件中。
     但是。当让父进程推迟两秒执行,子进程不推迟执行,会发现:此时子进程重定向到fork成功,而父进程重定向失败.
    
------总结一下:对于fork之后的重定向:
          1.在fork之后,两个进程对文件fork打开了两次,对于open 参数为 O_RDWR|O_CREAT 的时候,其中有一个进程打开文件失败,所以造成了重定向失败。
          2. 对于open参数是O_RDWR 的时候,两个进程都打开成功,但因为父进程sleep了两秒,所以父进程的数据把子进程的数据给覆盖了。     

fork代码注意事项:
1. 在没有调用exec之前,父子进程共享代码段,两者的代码完全相同 调用fork函数之后,条件判断父子进程执行对应的操作之后,在其后面的代码, 因为父子进程代码段的共享,所以子进程也会去执行
2.  fork之前的输出若是无缓冲输出,则子进程拷贝的缓冲区中没有数据,反之,若是行缓冲(没有\n)或者全缓冲(缓冲区为满):子进程会把父进程的缓冲区也拷贝一份,当每个进程终止时或者行缓冲遇到\n或者缓冲区满时,其缓冲区的内容都被写到相应文件中:
3. 文件描述符: 当父进程的文件描述符被重定向,子进程的文件描述符也会被重定向

fork有两种用法:
1 ,一个父进程希望复制自己,使父进程和子进程同时执行不同的代码段
2. 一个进程要执行一个不同的程序,如shell,这种情况下fork之后要立即调用exec

fork失败的主要原因:  
 1.系统中存在太多的进程
2.该实际用户ID的进程总数超过了系统限制


文件描述符表:请参考 http://blog.csdn.net/cywosp/article/details/38965239
4.