1、文件共享
fork时,创建的文件描述符,父子进程共享。在父子进程都对文件操作时,如果没有作同步处理,会出现相互干扰问题。现在说下fork后处理文件描述符的常用情况
(1)父进程等待子进程完成。在这种情况下,父进程无需对其描述符亻任何处理,当子进程终止后,它曾进行的读写操作的任一共享描述符的偏移量已进行了相应更新。
(2)父、子进程各自执行不同的程序段。在这种情况下,fork后,父、子进程各自关闭不需要使用的文件描述符,这样就不会干扰对方使用的文件描述符。这种方法是网络服务进程中经常使用的。
2、父、子进程的相同与区别
除了打开文件之处,父进程的很多其它属性也由子进程继承,继承的有
相同:
(1)实际用户ID、实际组ID、有效用户ID、有效组ID
(2)附加组ID
(3)进程组ID
(4)会话ID
(5)控制终端
(6)设置用户ID标志和设置组ID标志
(7)当前工作目录
(8)根目录
(9)文件模式创建屏蔽字
(10)信号屏蔽和安排
(11)针对任一打开文件描述符的在执行时关闭(close-on-exec)标志
(12)环境
(13)连接的共享存储段
(14)存储映射
(15)资源限制
区别:
(1)fork的返回值
(2)进程ID不同
(3)父进程ID不同
(4)子进程的tms_utime、tms_stime、tms_cutime及tms_ustime均被设置为0
(5)父进程设置的文件锁不会被子进程继承
(6)子进程的未处理的闹钟(alarm)被清除
(7)子进程的未处理信号集设置为空集
3、fork失败的的原因
系统中已经有太多的进程
该实际用户ID的进程总数超过了系统限制
4、fork的两种用法
(1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的-父进程等待客户端的服务请求。当这种请求到达后,父进程调用fork,使子进程处理此请求,父进程继续等待下一个服务请求到达。
(2)一个进程要执行一个不同的程序。这对shell是常见的情况,在这种情况下,子进程从fork返回后立即调用exec