1、fork()通过复制父进程在内存中的映像创建了一个新的子进程。子进程继承了诸如环境和权限这样的父进程属性。子进程还继承了某些父进程资源,如打开的文件和设备
,但不是父进程的每个属性或资源都被子进程继承。例如,子进程有一个新的进程id与父进程不同,子进程的CPU使用时间被重置为0.子进程没有获得父进程持有的锁
如果父进程设置了一个警报,父进程的警报到时的时候,不会通知子进程。即使父进程在执行fork时,父进程有挂起信号,子进程启动的时候也不会带有挂起信号。
2、vfork(): 他控制创建的子进程先运行, 子进程在父进程的地址空间运行, 直到子进程调用exit()或exec。在exec()后,新的进程完全替代原来的子进程运行。
3、文件缓冲
磁盘文件通常都是完全缓冲,FILE结构有一个缓冲区, 写的时候,先写进缓冲区,缓冲区满时, I/O子系统会用文件描述符调用write。程序执行fprintf的时刻和实际进行写操作的时刻之间的延时会造成很有趣的结果。因此,程序崩溃时, 程序看起来是正常结束,但是它的磁盘输出却是不完整的。
程序怎样避免缓冲对他的影响?fflush调用会强制写出FILE结构中缓冲的任何内容,也可以用setvbuf禁止缓冲。
与终端相关的文件是行缓冲(标准错误除外, 它默认是不缓冲的), 缓冲区被填满或者遇到一个换行符时,行会被写出。
4、文件描述符的继承
fork()时, 如果在fork前打开文件, 则,父子进程共享打开的文件描述符和文件偏移量;如果在fork后, 打开文件, 则父子进程分别打开文件,且在系统文件表中创建了各自的新条目, 子进程没有继承文件描述符,没有共享文件偏移量。但是,父子进程还是共享了标准输入、标准输出和标准错误的系统文件表条目。
注意: 一定注意, fork()前后, 文件描述符的继承关系,以及文件缓冲对输出的影响。