【问题标题】:Return type of vfork()vfork() 的返回类型
【发布时间】:2020-05-29 07:01:24
【问题描述】:

来自 GNU 手册:

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

这是什么意思?是不是说vfork()的返回值不能赋值给非pid_t类型的变量?

【问题讨论】:

    标签: vfork


    【解决方案1】:

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

    vfork() 两次返回:

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

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

    pid_t pid = vfork();
    

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

    NBmanual 说:

    vfork() 与 fork(2) 的不同之处在于调用线程被挂起 直到孩子终止(通常通过调用 _exit(2) 或 异常,在发出致命信号后),或者它调用 执行(2)。

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 2012-08-29
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多