UNIX程序设计中fork和vfork,exit和_exit的区别
创建子进程有很多种方式,调用fork()和vfork()是其中的两种方式
就说说fork和vfork的不同之处吧。
fork:
父进程调用完fork成功以后创建一个子进程,而且这个子进程会拷贝一份父进程的数据空间,堆和栈空间。并且父子进程的内存空间是完全独立的,并不共享。父进程和子进程谁先执行是不确定的。
vfork:
父进程调用完vfork后同样创建一个子进程,但是不同之处在于,子进程会先运行,在遇到exec或exit之后父进程才能运行(也就是说子进程结束以后父进程才能运行),子进程没有拷贝一份父进程的地址空间,而是在父进程的地址空间中运行。
下面来个例子吧。
fork:
#include <stdio.h>#include <unistd.h>#include <stdlib.h>int main(){ pid_t pid; int value; value = 10; pid = vfork(); if (pid < 0) { perror("fork failed!\n"); exit(0); } else if( pid == 0 )//child { value++; exit(0);//将刚才的_exit改成exit } else { printf("value = %d\n", value); } return 0;}可能会出现的情况是父进程打印不出东西来(具体还是得看系统实现),因为vfork后的子进程和父进程在同一个地址空间中运行,子进程调用会exit(0)会关闭标准输入输出流,所有会导致父进程的输出流被子进程关闭了,导致输出不了,(可能有些系统还是可以输出,因为系统实现不同,但是还是不要用exit()比较好)。