首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

UNIX程序设计中fork跟vfork,exit和_exit的区别

2012-09-04 
UNIX程序设计中fork和vfork,exit和_exit的区别创建子进程有很多种方式,调用fork()和vfork()是其中的两种方

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;}

上面将刚才的_exit(0)改成exit(0)

可能会出现的情况是父进程打印不出东西来(具体还是得看系统实现),因为vfork后的子进程和父进程在同一个地址空间中运行,子进程调用会exit(0)会关闭标准输入输出流,所有会导致父进程的输出流被子进程关闭了,导致输出不了,(可能有些系统还是可以输出,因为系统实现不同,但是还是不要用exit()比较好)。


热点排行