曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6810|回复: 0
打印 上一主题 下一主题

[进程] fork() 和 vfork() 的区别

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-6-16 00:34:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
vfork() 也可以用来创建一个新进程,与 fork相比,他有自己独特的用处,以下是两者的差异的一个详细对比:
      vfork() 和 fork() 一样都是一次调用,返回两次。
      使用 fork() 创建一个子进程时,子进程只是完全复制父进程的资源。这样得到的子进程独立于父进程,具有两号的并发性。而使用 vfork() 创建一个子进程时,操作系统并不将父进程的地址空间完全复制到子进程,用 vfork() 创建的子进程共享父进程的地址空间,也就是说子进程完全运行在父进程的地址上。子进程对该地址空间中任何数据的修改同样为父进程所见。
      使用 fork() 创建一个子进程时,哪个进程先运行取决于系统的调度算法。而 vfork() 一个进程时,vfork() 保证子进程先运行,当它调用 exec 或 exit 之后,父进程才可能被调度运行。如果在调用 exec 或 exit 之前,子进程要依赖父进程的某个行为,就会导致死锁。
因为使用 fork() 创建一个子进程时,子进程需要将父进程几乎每种资源都复制,所以 fork() 是一个开销很大的系统调用,这些开销并不是所有的情况都需要。比如,fork() 一个进程后,立即调用 exec() 执行另外一个应用程序,那么 fork() 过程中子进程对父进程地址空间的复制将是ige多余的过程。vfork() 不会拷贝父进程的地址空间,这大大减小了系统开销。

示例程序:
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int globVar = 5;

int main(void)
{
    pid_t pid;
    int i, var = 1;

    printf("fork is different with vfork \n");

    pid = fork();
    
    switch(pid) {
        case 0:
           i = 3;
           while( i-- > 0 ) {
            printf("Child process is running\n");
            globVar++;
            var++;
            sleep(1);
        }
        printf("Child's globVar = %d, var = %d\n", globVar,var);
        break;

        case -1:
            perror("Process creation failed\n");    
            exit(0);
        default:
            i = 5;
            while(i-- > 0) {
                printf("Perent process is running\n");
                globVar++;
                var++;
                sleep(1);
            }
        printf("Perent's GlobVar = %d, var = %d\n", globVar, var);
        exit(0);
    }
 exit(0);
}

编译并运行这个程序
beyes@linux-beyes:~/C/base> ./diffork.exe
fork is different with vfork
Perent process is running
Child process is running
Perent process is running
Child process is running
Child process is running
Perent process is running
Child's globVar = 8, var = 4
Perent process is running
Perent process is running
Perent's GlobVar = 10, var = 6

把上面程序中 pid = fork(); 改成 pid = vfork(); 然后再次编译运行:
[beyes@localhost syscall]$ ./vfork
fork is different with vfork
Child process is running
Child process is running
Child process is running
Child's globVar = 8, var = 4
Perent process is running
Perent process is running
Perent process is running
Perent process is running
Perent process is running
Perent's GlobVar = 13, var = 9

对比上面两个程序,可以看到,vfork() 出来的子进程和父进程共享了全局变量 GlobVar 以及局部变量 var ,而且 vfork() 保证了子进程先运行结束然后再到父进程。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 20:22 , Processed in 0.078219 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表