0

来自 GNU 手册:

vfork() 函数与 fork(2) 具有相同的效果,除了如果由 vfork() 创建的进程修改任何数据而不是用于存储来自 vfork() 的返回值的 pid_t 类型的变量,则行为未定义,

这是什么意思?这是否意味着 的返回值vfork()不能分配给非pid_t类型变量?

4

1 回答 1

0

该手册对此感到非常困惑。实际上,两个进程(子进程和父进程)共享相同的地址空间,甚至是堆栈!

vfork()返回两次:

  1. 在子进程中,返回 0
  2. 当子进程完成或执行其他程序时,第二次返回是在父进程中使用子进程标识符完成的。同时,父进程被暂停。

的返回码fork()/vfork()通常存储在一个变量中(类型pid_t遵循系统调用的概要):

pid_t pid = vfork();

vfork()由于在运行时父子共享地址空间,所以父子都修改了同一个变量!但是在子进程中它被顺序设置为0,并且在后者退出或执行程序后,该变量被第二次设置,但在父进程中使用子进程的pid。

注意手册说:

vfork() 与 fork(2) 的不同之处在于调用线程被挂起,直到子进程终止(正常情况下,通过调用 _exit(2),或异常情况下,在传递致命信号后),或者调用 execve( 2)。

于 2020-11-05T11:41:45.073 回答