首页 > APUE2e Exercise 8.2: vfork v.s. fork 问题.

APUE2e Exercise 8.2: vfork v.s. fork 问题.

如果不是在main函数中而是在另一个函数中调用vfork,以后子进程从该函数返回时,将会发生什么情况?

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>

#define P_INFO printf("chld %u, self %u, father %u \n", pid, getpid(), getppid())

void err_sys (const char* val)
{
  fprintf(stdout, val);
  return;
}

void func (void)
{
  pid_t pid = -1; 
  pid = vfork();
  if (pid < 0) {
    err_sys("vfork failed\n");
  }
  if ( pid == 0) {
    printf("child 2\n");
    P_INFO;
    return;
  }
  if (pid > 0) {
    printf("father 1 func\n");
    P_INFO;        
    return;
  }
}

void funf (void)
{
  pid_t pid = getpgrp();
  P_INFO;
  return;
}

int main (int argc, char** argv) 
{
  pid_t pid = getpgrp();
  printf("father 1\n");
  func();
  printf("father 1, out func to funf\n");
  funf();
  printf("father 1, out funf to exit\n");
  P_INFO;
  return 0;
}

哦.明白了...


挺好玩的, 我这边看到是子进程可以退出, 父进程必定 segment fault.

  1. vfork, 子进程在execexit之前, 用的是父进程的地址空间.
  2. 在子进程在execexit之前, 父进程被挂起.

所以子进程先退出, 退出后 内核 释放进程内存空间, 因为这里子父进程用的是一个地址空间, 就把父进程搞死了.


嗯, 这种行为是undefine. 另一台机子, 结果是 Illegal instruction


你这样完全是在滥用api。你应该搞清楚vfork是用来做什么的。在vfork()产生的子进程结束或者调用exec之前,父进程应当使用wait等待。

【热门文章】
【热门文章】