日期:2014-05-16  浏览次数:20700 次

linux C程序,请问下面一个程序为什么会出现Segmentation fault ??
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  pid_t pid;

printf("hello ni hao\n\n");
  if ((pid = vfork()) < 0)
  printf("fork error\n");
  else if (pid == 0) 
{
  printf("child, pid = %d\n", getpid());
   
  } 
else 
{
  printf("parent, pid = %d\n", getpid());
  }

  printf("hello\n");
return 0;
}

/*
[root@localhost testing]# ./dir_test
hello ni hao

child, pid = 6948
hello
parent, pid = 6947
hello
Segmentation fault
[root@localhost testing]# 
*/

------解决方案--------------------
C/C++ code

...
else if (pid == 0)  
{
  printf("child, pid = %d\n", getpid());
    exit(0);    //vfork 保证子进程先运行,在调用exec 或exit 之后父进程才可能被调度运行
  }
/...

------解决方案--------------------
需要注意fork与vfork的不同:
vfork:父进程和子进程共享虚拟内存,父进程的内存变化(修改,删除)都能影响子进程。
fork:父进程和子进程共享虚拟内存,但使用COW(Copy on Write)技术。但发生内存修改时,会copy一份全新的内存。

这样,由于楼主使用了vfork(它保证子进程先运行),当子进程运行结束退出后销毁了内存,这样父进程的内存也便得无效了,后续的访问当然段错误啦。

使用vfork一定要在子进程启动后调用exec函数族,以便加载一份新的内存。

vfork基本已经废弃,请不要使用。