vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,
vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间
完全复制到子进程中,因为子进程会立即调用exec,于是也就不会存放该地址空间。不过在子进程中调用exec或exit之前,他在父进程的空间中运行。
vfork和fork之间的另一个区别是: vfork保证子进程先运行,在她调用exec或exit之后
父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作
,则会导致死锁。
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,
当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数
开始执行,因为调用exec并不创建新进程,所以前后的进程id 并未改变,exec只是用
另一个新程序替换了当前进程的正文,数据,堆和栈段。
例子1:用fork创建子进程
#include "apue.h"
int glob = 6; /* external variable in initialized data */
int
main(void)
{
int var; /* automatic variable on the stack */
pid_t pid;
var = 88;
printf("before vfork\n"); /* we don't flush stdio */
if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) { /* child */
glob++; /* modify parent's variables */
var++;
_exit(0); /* child terminates */
}
/*
* Parent continues here.
*/
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
输出:
a write to stdout
before fork
pid = 3130,glob = 6,var = 88
pid = 3131,glob = 7,var = 89
这里printf一次,但却输出两次,为什么?
用fork创建的子进程会产生父进程的副本,即子进程会copy调用fork函数后的代码断,本例子中子进程拥有:
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
同样父进程也拥有:
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
当每一个进程终止时,其缓存中的内容被输出。
例子2:用vfork创建子进程
#include "apue.h"
int glob = 6; /* external variable in initialized data */
int
main(void)
{
int var; /* automatic variable on the stack */
pid_t pid;
var = 88;
printf("before vfork\n"); /* we don't flush stdio */
if ((pid = vfork()) < 0) {
err_sys("vfork error");
} else if (pid == 0) { /* child */
glob++; /* modify parent's variables */
var++;
_exit(0); /* child terminates */
}
/*
* Parent continues here.
*/
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
输出:
a write to stdout
before fork
pid = 3169,glob = 7,var = 89
分享到:
相关推荐
这个程序是为了分析fork()函数和vfork()函数的区别,使用的系统环境是linux
功能说明 strace 命令是一种强大的工具, 能够显示任何由用户空间程式发出的系统调用....-f -F选项告诉strace同时跟踪fork和vfork出来的进程 -o xxx.txt 输出到某个文档. -e execve 只记录 execve 这类系统调用.
在linux系统中,fork(),vfork()和clone函数都可以创建一个进程,但是它们的区别是什么呢?本文就这三者做一个较深入的分析,感兴趣的朋友一起看看吧
创建新进程:fork函数:fork函数干什么? fork函数与vfork函数的区别在哪里?为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?
vfork函数示例
主要介绍了深入解读Linux进程函数fork(),vfork(),execX(),分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
3,要求分别用fork和vfork创建子进程。 实验五 创建子进程一,在子进程中递归打印/home目录中的内容(用exec系列函数调用第二次实验中的代码完成此功能); 1.子进程结束的时候完成以下功能: 打印字符...
在linux下通过C语言实现了fork与vfork的区别,里面有源码,可以用gcc编译运行分析
打通Linux脉络系列:进程、线程和调度 ...2.1 fork 和 vfork 区别 2.2 写时拷贝技术 2.3 Linux线程的实现本质 2.4 孤儿进程的托孤,SUBREAPER 练习题 第三部分大纲 练习题 第四部分大纲 练习题
概括 sfork是Linux上新系统调用的原型,它为启动进程提供了同步的单线程接口。 sfork可以看作是vfork一种变体,它做了... 但是,与传统的fork和vfork , sfork只会返回一次。 sfork成功时总是返回0,如果由于任何通常
本文分享了Linux vfork与fork简单对比分析,分享给大家,具体如下: fork相关问题: 一、fork基础了解 fork作用为创建一个子进程,在使用了fork命令后,内核会分配新的内存块和数据结构给子进程,并且将父进程的...
一、描述进程——PCB ·进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合 ·我们称为PCB,Linux操作系统下的PCB是:task struct 2、task_struct——PCB的一种 ·在Linux中描述进程的结构体...
详细介绍了fork和vfork两者的区别和联系,而在Linux下编写多进程的人来说,fork是最难理解的概念之一。因此此文很强大。
Linux 系统中通过 fork/vfork 系统调用来创建新进程。本文将介绍如何使用 fork/vfork 系统调用来创建新进程并使用 exec 族函数在新进程中执行任务。 fork 系统调用 要创建一个进程,最基本的系统调用是 fork: # ...
详细的描述linux系统调用fork、vfork、clone在内核中的实现,既有详细文字描述又有全部的源码加注释,有助于深入理解linux进程地址空间