Linux系统编程(vfork和fork)

news2024/12/23 6:57:22

文章目录

  • 前言
  • 一、vfork讲解
  • 二、vfork使用
  • 三、exit和_exit
    • 1.exit和_exit对比
    • 2.在vfork中的使用
  • 四、vfork和fork区别
  • 总结


前言

本篇文章讲解vfork和fork创建进程的区别。

一、vfork讲解

vfork 是一个在类Unix操作系统中的系统调用,它创建一个新进程,且该进程与父进程共享内存空间。Vfork系统调用的目的是为了在子进程中执行一个新的程序,通常是通过调用exec系列函数来实现。

vfork 的函数原型如下:

#include <unistd.h>

pid_t vfork(void);

vfork 函数返回一个正值给父进程,返回0给子进程,或者返回一个负值表示创建失败。父进程和子进程之间的主要区别在于在子进程调用 exec 函数之前,它会挂起父进程的执行。这样,子进程可以直接执行一个新的程序,而不需要复制父进程的地址空间。

使用 vfork 创建的子进程与父进程共享同一个地址空间,这意味着子进程可以直接访问父进程的变量、函数和堆栈等。由于父进程被挂起,直到子进程调用 exec 函数或 _exit 函数终止,父进程在子进程运行期间是阻塞的。

需要注意的是,由于子进程与父进程共享同一份地址空间,因此在子进程中修改父进程的变量和数据可能会导致不可预期的行为,因此要小心使用。一般来说,vfork 主要用于创建一个新进程,并在该进程中立即调用 exec 函数来加载一个新程序。这样可以避免复制父进程的大型地址空间,提高创建子进程的效率。

总结一下,vfork 是一个在类Unix操作系统中的系统调用,用于创建一个新进程,并与父进程共享地址空间。子进程通过调用 exec 函数来执行一个新程序。父进程在子进程调用 exec 函数之前会被挂起,直到子进程结束或调用 _exit 函数。使用 vfork 可以避免复制父进程的地址空间,从而提高创建子进程的效率。但要小心在子进程中修改父进程的变量和数据,以避免不可预期的结果。

在这里插入图片描述

二、vfork使用

这里使用vfork创建了进程:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

#define EXE "test"

int main(void)
{
    int pid = 0;

    char* argv[3] = {EXE, "world", NULL};

    printf("begin\n");

    printf("now pid : %d\n", getpid());

    if((pid = vfork()) != 0)
    {
        //父进程
    }
    else
    {
        //子进程
        execve(EXE, argv, argv);
        _exit(0);
    }  

    printf("end\n");

    return 0;
}

三、exit和_exit

1.exit和_exit对比

_exit 和 exit 是两个在C语言中常用的函数,用于进程的终止。它们的主要区别在于以下几点:

头文件不同:_exit 函数在 <unistd.h> 头文件中声明,而 exit 函数在 <stdlib.h> 头文件中声明。

执行清理函数的行为:_exit 函数会直接终止进程,不会执行任何清理操作,包括清理注册的函数(比如通过 atexit 注册的函数)。而 exit 函数在终止进程之前会执行这些清理函数,包括文件的关闭、内存的释放、缓冲区的刷新等。这使得 exit 函数更适合用于正常的进程终止,可以确保资源被正确释放。

返回值的意义不同:_exit 函数的返回值作为进程的终止状态,可以被父进程通过 wait 系统调用获取到。而 exit 函数的返回值通常被忽略,它会被用作状态码传递给父进程,父进程可以通过相关的方式读取该状态码,例如在 shell 中使用 $? 来获取。

缓冲区刷新:_exit 函数不会刷新缓冲区,这意味着通过 printf 等函数输出的内容可能不会立即显示出来。而 exit 函数会刷新缓冲区,确保所有的输出都被写入对应的文件或在屏幕上显示出来。

2.在vfork中的使用

vfork 创建的子进程通常只能调用 _exit 函数,而不应该调用 exit 函数。这是因为 vfork 在创建子进程时会共享父进程的地址空间,包括栈、堆和全局变量等。子进程在调用 exec 或 _exit 函数之前不能修改父进程地址空间中的任何数据,否则会导致不可预测的行为。

exit 函数在执行时会进行一系列的清理工作,包括关闭文件描述符、释放动态分配的内存、刷新缓冲区等。这些操作可能会影响到父进程状态和资源的正确释放,而且在共享地址空间的情况下,子进程对这些资源的修改会影响到父进程。

为了避免这种混乱和不确定性,vfork 子进程应该尽量快速地调用 _exit 函数来终止自己。_exit 函数直接终止进程,不进行任何清理,并且不会影响到父进程的状态或资源。

总结起来,vfork 创建的子进程应该使用 _exit 函数来终止自己,而不应该调用 exit 函数。这样可以避免对父进程地址空间中的数据和资源产生不可预测的影响,确保子进程的终止操作不会影响到父进程。

四、vfork和fork区别

vfork 和 fork 是两个在类Unix操作系统中常用的系统调用,用于创建新的进程。它们之间的主要区别如下:

1.地址空间的复制方式:vfork 创建的子进程与父进程共享地址空间,而 fork 创建的子进程会复制父进程的地址空间。这意味着在 vfork 的子进程中,对地址空间的修改会影响到父进程,而在 fork 的子进程中,修改则是独立的。

2.父进程的行为:vfork 创建的子进程会共享父进程的资源(如文件描述符、堆栈等),并且父进程会在子进程调用 exec 或 _exit 函数之前挂起。而 fork 创建的子进程会复制父进程的资源,并且父进程和子进程可以同时运行。

3.子进程的返回值:在 vfork 中,子进程的返回值是通过函数返回值方式返回的,即在子进程中直接返回,而在父进程中可以通过获取子进程的返回值。而在 fork 中,子进程的返回值为0,父进程中可以通过获取子进程的PID来区分父进程与子进程。

4.父进程的阻塞:在 vfork 中,父进程会在子进程调用 exec 或 _exit 函数之前一直被阻塞,直到子进程终止或执行了新的程序。而在 fork 中,父进程和子进程可以并发执行,它们的执行顺序取决于操作系统的调度算法。

综上所述,主要的区别在于地址空间的复制方式、父进程的行为、子进程的返回值以及父进程的阻塞方式。vfork 创建的子进程与父进程共享地址空间,并且父进程会被阻塞;fork 创建的子进程复制父进程的地址空间,父子进程可以同时执行。选择使用哪个系统调用取决于具体的需求和场景。一般而言,fork 是更常用的方式,而 vfork 则用于特定的情况,例如在子进程中立即执行 exec 函数。

总结

本篇文章讲解了vfork的具体操作和内部含义,并且将vfork和fork进行了对比。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

欠拟合、过拟合、正则化、学习曲线

1.欠拟合、过拟合、正则化、学习曲线 1.1 欠拟合、过拟合 欠拟合&#xff1a;模型相对于要解决的问题来说太简单了&#xff0c;模型并没有拟合训练数据的状态 过拟合&#xff1a;模型相对于要解决的问题来说太复杂了&#xff0c;模型只能拟合训练数据的状态 下图来自&#x…

第41步 深度学习图像识别:Efficientnet建模(Tensorflow)

一、写在前面 &#xff08;1&#xff09;Efficientnet EfficientNet是Google在2019年提出的一种新的卷积神经网络架构&#xff0c;主要目标是提高模型的效率&#xff0c;即在保持或提高模型性能的同时&#xff0c;尽可能地降低模型的复杂性和计算需求。 EfficientNet的关键思…

【MySQL】表的内外连接

目录 一、内连接&#xff08;表1 inner join 表2 on&#xff09; 1、显示SMITH的名字和部门名称 二、外连接 1、左外连接&#xff08;表名1 left join 表名2 on&#xff09; 1.1查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出…

2022(一等奖)D775北部湾红树林生理结构参数对水位变化的响应特征研究

作品介绍 1 应用背景 红树林作为全球生产力最高的生态系统之一&#xff0c;是生长在热带、亚热带海湾的一种特殊的木本植物群落。它由于其独特的海陆过渡特性&#xff0c;在维持滨海生态稳定、促进海陆能量循环中起着重要作用。同时&#xff0c;红树林可以吸附温室气体&#x…

第十二章 EfficientNetv2网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

Python爬取数据并进行数据CRUD的Web可视化项目

项目内容简介 爬取网站https://book.douban.com/top250上面的Top250数据,然后将数据保存到Mysql数据库中,最后这些数据记录以Web的方式进行展示,并实现对这些数据记录的CRUD(增删改查)! 项目实现简介 对豆瓣网站的爬虫的实现。 见项目中的爬取豆瓣Top250脚本(beautifulSoup).…

Linux下MySQL的安装与使用

文章目录 安装前说明Linux系统及工具的准备查看是否安装过MySQLMySQL的卸载 MySQL的Linux版安装下载MySQL指定版本CentOS7下检查MySQL依赖CentOS7下MySQL安装过程 查看MySQL版本服务的初始化启动MySQL&#xff0c;查看状态查看MySQL服务是否自启动 MySQL登录设置远程登录 安装前…

【计算机组成原理】输入输出系统

目录 一、外部设备概述 二、输入输出接口 三、主机与外设交换信息的方式 四、中断系统 五、中断请求 六、中断响应 七、中断服务 一、外部设备概述 外部设备在计算机系统中的作用&#xff1a; 人机对话的重要设备&#xff08;交互&#xff09;完成数据媒体变换的设别&…

chatgpt赋能python:Python等待一秒-程序员必知的等待操作

Python等待一秒 - 程序员必知的等待操作 时间是宝贵的资源&#xff0c;你可能会需要让你的Python程序等待一段时间才能继续执行。在这篇文章中&#xff0c;我们将学习如何使用Python等待一秒&#xff0c;包括为什么需要等待&#xff0c;以及在Python中如何等待。 为什么需要等…

前端web入门-CSS-day07

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 定位 相对定位 绝对定位 定位居中 固定定位 堆叠层级 z-index 定位-总结 高级技巧 CSS 精灵 字…

QT(一) 安装 QT(二)GUI程序设计基础

第一章 &#xff1a; Qt 安装 下载地址安装 打开 cmd 运行镜像 &#xff1a; qt-unified-windows-x64-4.6.0-online.exe --mirror https://mirrors.aliyun.com/qt Hello 因为是qmake 所以是.proCtrl R 直接运行 第二章 GUI程序设计基础 main文件 *.ui : 有UI设计器自动生成…

操作系统02-OS结构

目录 一、概述 二、内容 三、总结 一、概述 操作系统以服务的形式向程序和用户提供执行程序的基本服务&#xff0c;包括用户界面、程序执行、IO操作、文件系统操作、通讯、错误监测等。 二、内容 2.1 OS服务和接口 1 操作系统服务 2 操作系统程序接口&#xff1a;系统调…

阿里架构师分享分布式架构笔记文档:Nginx+Redis+ZK+Kafka+MQ等

Nginx Nginx 是一款非常优秀的开源软件&#xff0c;工作需要&#xff0c;研究了很久一段时间的 Nginx 源码&#xff0c;在研究学习的过程中收益颇多。作为高性能服务器的代表&#xff0c;为了追求极致的高性能&#xff0c;在许多方面&#xff0c;Nginx 的源码实现都可以称得上…

Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟完美替代品)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品) 环境 win10pixel4Android13概览 …

JS将PDF转图片,pdfjs的使用

Hi I’m Shendi 最近做转换工具&#xff0c;需要将pdf转图片&#xff0c;这里记录下来 JS将PDF转图片&#xff0c;pdfjs的使用 简介 A general-purpose, web standards-based platform for parsing and rendering PDFs. 一个通用的、基于web标准的平台&#xff0c;用于解析和…

word公式mathtype公式

行间公式&#xff1a; 直接点“有编号” 内联公式&#xff1a; 直接点“内联” 交叉引用&#xff1a; 插入引用&#xff0c;双击编号 行内公式大小不统一&#xff0c;公式的代码可能上漂 解决方案&#xff1a;法一&#xff1a;切换Tex&#xff0c;再次切换过来。 法二&…

ElasticSearch的核心概念简单描述

我正在参加「掘金启航计划」 ES核心概念 ES是面向文档,下面表格是和关系型数据库的对比,一切都是JSON 关系数据库(Mysql)ES数据库(database)索引(indices) 和数据库一样表(tables)types 慢慢会被弃用 7.0已经过时 8.0会彻底废弃行(rows)documents (数据)文档字段(columns)fi…

简单图论+二分搜索:环境治理

题目描述 LQ 国拥有 n 个城市, 从 0 到 n−1 编号, 这 n 个城市两两之间都有且仅有 一条双向道路连接, 这意味着任意两个城市之间都是可达的。每条道路都有一 个属性 D, 表示这条道路的灰尘度。当从一个城市 A 前往另一个城市 B 时, 可 能存在多条路线, 每条路线的灰尘度定义为…

前端项目规范化:手把手教你使用prettier和pre-commit(git hook或者husky)优化规范项目代码

如何在提交代码之前&#xff0c;进行代码格式化检查&#xff0c;保证每个成员的代码都是同一个风格呢&#xff1f; 最简单的两种方式&#xff1a; 使用 prettier git pre-commit 使用 prettier husky(原理和第一种一模一样哦) 名词简介 git hooks 下图为git hooks的官方…

FcaNet: Frequency Channel Attention Networks论文总结和代码详解

论文&#xff1a;https://arxiv.org/abs/2012.11879 中文版&#xff1a;FcaNet: Frequency Channel Attention Networks 源码&#xff1a;https://github.com/cfzd/FcaNet或https://gitee.com/yasuo_hao/FcaNet 目录 一、论文背景和出发点 二、创新点 三、离散余弦变换&…