Appearance
子进程
- 通过 fork(2) 从父进程创建子进程
- 子进程的创建过程是:拷贝父进程的堆栈,rodata 段,data 段,bss 段。

- fork 之后,父子进程执行的先后顺序是不一样的(取决于算法调度)。
- fork 之后,父子进程都是从下一条语句开始指向的。
- fork 之后,父子进程都具有 4G 虚拟地址空间。互相不影响。
- fork 之后,子进程会继承父进程的文件描述符集合,共享文件状态标志符和文件偏移量。
缓冲区
因为会拷贝缓冲区,所以有时候会有问题(比如使用终端的时候是行缓存,然后文件是全缓存,使得终端运行正常,输出到文件就异常)。使用标准 I/O 的话,在 fork 之前必须 fflush() 刷新缓冲区。
执行顺序
永远不要假定父子进程的执行顺序,这是有系统调度器的调度策略决定的。(利用进程间通信)
其他
- Linux 基本上所有的线程都是从 init 线程(现在命名是 systemd 线程) fork 并通过 exec() 创建的