Linux学习之“vfork函数”

为什么使用vfork()?

希望父子进程执行不同的代码。例如:

网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达。

vfork与fork的函数原型相同,用于创建新进程,而该新进程的目的是exec一个新程序(执行一个可执行的文件)。

由于新程序将有自己的地址空间,因此vfork函数并不将父进程的地址空间完全复制到子进程中。

注意以下两点:

1.子进程在调用exec或exit之前在父进程的地址空间中运行

2.vfork函数保证子进程先执行,在它调用exec或者exit之后,父进程才可能被调度执行

因为在_exit(0);之前子进程运行在父进程的地址空间中,所以对glob和var的++操作都最终在父进程中输出了。

至于最后为什么使用_exit而不是exit,见"Linux学习之"exit函数""为什么使用vfork()?

希望父子进程执行不同的代码。例如:

网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达。

vfork与fork的函数原型相同,用于创建新进程,而该新进程的目的是exec一个新程序(执行一个可执行的文件)。

由于新程序将有自己的地址空间,因此vfork函数并不将父进程的地址空间完全复制到子进程中。

注意以下两点:

1.子进程在调用exec或exit之前在父进程的地址空间中运行

2.vfork函数保证子进程先执行,在它调用exec或者exit之后,父进程才可能被调度执行

因为在_exit(0);之前子进程运行在父进程的地址空间中,所以对glob和var的++操作都最终在父进程中输出了。

至于最后为什么使用_exit而不是exit,见"Linux学习之"exit函数""

时间: 2024-10-13 00:57:12

Linux学习之“vfork函数”的相关文章

Linux系统编程——vfork() 函数详解

所需头文件: #include <sys/types.h> #include <unistd.h> pid_t vfork(void); 功能: vfork() 函数和 fork() 函数(fork()如何使用,请点此链接)一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的. 参数: 无 返回值: 成功:子进程中返回 0,父进程中返回子进程 ID.pid_t,为无符号整型. 失败:返回 -1. fork() 与 vfock() 都是创建一个进程,那它们有什么区别呢

Linux学习之“exit函数”

先看下"_exit"和"exit": exit被调用时,将冲刷所有的标准I/O流,关闭所有打开的文件描述符.在传统实现中,同时也将关闭标准I/O流.即表示标准输出FILE对象的相关存储区将被清0.而_exit不会执行这些操作. 由于父子进程共享同一地址空间,当父进程恢复运行并调用printf时,不会产生任何输出,它返回-1.这就是上一节调用_exit的原因. 然而,大多数exit的现代实现不再关闭流.因为进程即将终止,内核将关闭所有已打开的文件描述符. Linux程

Linux学习之“fork函数”

n返回值: fork函数调用一次,但是返回两次:在子进程中返回0,在父进程中返回子进程ID,出错返回-1.通过返回值,可以确定是在父进程还是子进程中. n子进程和父进程继续执行fork调用之后的指令. 子进程是父进程的副本: 1.子进程获得父进程数据空间.堆和栈的副本:父子进程并不共享这些存储空间. 2.父子进程共享正文段(只读的): 3.为了提高效率,fork后并不立即复制父进程空间,采用了COW(Copy-On-Write):当父子进程任意之一,要修改数据段.堆.栈时,进行复制操作,但仅复制

linux学习之路之函数的使用

什么是函数呢? 函数就是将一些代码封装起来,实现代码重用的功能 函数是不能独立运行的,只有函数调用时才可以执行,而且可以调用多次 使用函数的好处可以避免代码多次重复使用,是程序代码更具有结构性. 那么该如何定义函数呢? 定义函数有二种结构 结构一: function FUNCNAME { COMMAND } 其中function为关键字,FUNCNAME为函数名,COMMAND为函数体内执行的命令 结构二: FUNCNAME() { COMMAND } 其中FUNCNAME为函数名 我们说过函数

Linux学习笔记——例说makefile 增加系统共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

linux学习之shell练习

linux学习之shell练习 1.描述shell程序的运行原理(可附带必要的图形说明): 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟): 总结文章:http://pizimsn.blog.51cto.com/7002551/1697671 3.总结课程所讲的所有循环语句.条件判断的使用方法及其相关示例:(if (jpg|png is not exist):echo "You say a XX") 总结文章:http://pizimsn.b

linux学习之进程,线程和程序

                                                                                  程序.进程和线程的概念 1:程序和进程的差别 进程的出现最初是在UNIX下,用于表示多用户,多任务的操作系统环境下,应用程序在内存环境中基本执行单元的概念.进程是UNIX操作系统环境最基本的概念.是系统资源分配的最小单位.UNIX操作系统下的用户管理和资源分配等工作几乎都是操作系统通过对应用程序进程的控制实现的! 当使用c c++ j

linux学习(二)——汤哥的推荐书籍

成为一名精通 Linux程序设计的高级程序员一直是不少朋友孜孜以求的目标. 根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows程序员的 1.8 倍.Java 程序员的 2.6 倍, Linux 程序员年终奖金平均为 Windows 程序员的 2.9倍.同时数据显示,随着工作经验的增长, Linux 程序员与 Windows 程序员的收入差距还有扩大的趋势. Denis 认为,要学好Linux 环境下的编程,关键是要看对.选对.学会正确的书籍. 可以说,如果你选对了Li

Linux学习之源码1:入口流程

有地方看到,启动流程是arch/arm/boot/compressed/head.s ----->调用arch/arm/boot/compressed/misc.c的decompress_kernel()函数解压内核.---->arch/arm/kernel/head-common.S初始化 ---->init/main.c的asmlinkage void __init start_kernel(void) 注意在arch/arm/kernel/smp.c文件中有一个启动多核处理器的函数