子进程完全复制了父进程的内容,除了下面的东西(posix标准):
- PID
- PPID
memory lock (mlock, mlockall)
mlock主要是用来防止部分虚拟地址空间被交换到交换空间。
Process resource utilizations 和 CPU time counters
系统资源使用率是指像CPU使用时间,内存使用大小,IPC消息传递数量,上下文切换次数等,这些当然是独立的。计时器的话指的是用户使用时间、内核使用时间之类的,也是得清0。
pending signals
这里说一下,pending signals指的是像sigterm、sigkill、sigstop…包含这些个信号的列表,这些信号因为进程处于D(uninterruptible sleep)状态,而无法及时被处理,等待的进程被唤醒。
process-associated record locks
比如文件锁flock之类的,这类锁只能关联一个进程,所以子进程当然也没办法继承咯。
timers
定时器是无法被继承的,可能因为跟信号有关?
asynchronous I/O operations (aio_read, aio_write)
此外注意下面的点:
- 当一个线程通过fork()创建一个子进程,整个虚拟地址空间都会被拷贝,包括mutex的状态,条件变量,还有其他的pthread objects。可以使用pthread_atfork()来处理一些mutex之类的问题。
- 当多线程的进程fork之后,子进程应该只调用async-signal-safe函数(man signal-safety),直到它调用execve。
- 子进程继承了父进程的打开的文件描述符的列表。他们指向了相同的文件描述,也就是说两个文件描述符共享打开文件的状态,文件offset,信号驱动I/O属性。
- 总之,不要在多线程的进程中尝试使用fork()。
参考:man fork(2) http://man7.org/linux/man-pages/man2/fork.2.html