fork creates a child process that differs from the parent process only in its PID and PPID, and in the fact that resource utilizations are set to 0. File locks and pending signals are not inherited.
以上来自于man fork的解释。fork创建了一个与父进程的内存完全一致的子进程。即在fork的时刻拷贝了一份内存数据到子进程中。
在 POSIX 标准中,fork 的行为是这样的:复制整个用户空间的数据(通常使用 copy-on-write 的策略,所以可以实现的速度很快)以及所有系统对象,
然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的。
其它线程的突然消失,是一切问题的根源。
其它线程的突然消失,是一切问题的根源。
这就会导致,父进程在获取到锁的情况下,fork了一个子进程。子进程的内存中,这个锁的状态是上锁状态。
子进程仅运行了fork所在的这个线程,其它线程没有运行,当它尝试获取锁时,就发生了死锁。

在多线程程序中,使用fork可能导致死锁问题。当父进程在持有锁的情况下创建子进程,子进程会继承锁的状态,从而在尝试获取相同锁时发生死锁。这个问题源于fork只会复制当前线程到子进程,其他线程不会被继承,导致资源状态不一致。示例代码展示了这种情况,其中子进程在父进程的线程睡眠期间尝试获取已被锁定的mutex,导致死锁发生。
最低0.47元/天 解锁文章
731

被折叠的 条评论
为什么被折叠?



