当前位置: 首页 > news >正文

Linux fork和vfork函数用法

forkvfork是用于创建新进程的函数,在Linux的C语言编程中非常常见。

fork函数

fork函数是用于创建一个新的进程,新进程是调用进程的副本。新进程将包含调用进程的地址空间、文件描述符、栈和数据。在fork之后,父进程和子进程将并发执行。

  • fork后会有两个并发程序执行
  • 子进程复制了父进程的数据段,包括全局变量

fork函数原型:

pid_t fork(void);

fork函数返回值为:

  • 如果是在父进程中,返回新创建的子进程的进程ID;
  • 如果是在子进程中,返回0;
  • 若出现错误,返回-1。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/*** fork后会有两个并发程序执行* 子进程复制了父进程的数据段,包括全局变量
*/
int main() {pid_t val;printf("PID before fork(): %d\n",getpid());val = fork();// *********************************************************************if(val == 0) {printf("I am the child process, PID is %d\n", getpid());} else if(val > 0) {printf("I am parent process, PID is %d\n", getpid());} else {printf("Error");}
}

image-20231121145831531

fork语句后开始父进程和子进程。

image-20231121150110720

vfork函数

vfork函数是Linux和Unix系统中用于创建新进程的另一个函数,与fork函数类似,但行为有所不同。vfork创建的新进程与调用进程共享地址空间,这样可以减少内存的使用。然而,需要注意的是,在子进程调用execexit之前,父进程会被阻塞。

  • vfork创建的子进程与父进程共享地址空间
  • 调用vfork创建子进程后,父进程会被挂起,直到子进程结束
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/*** vfork创建的子进程与父进程共享地址空间* 调用vfork创建子进程后,父进程被挂起,直到子进程结束。
*/
int A = 0;
int B = 0;
int main()
{pid_t val;val = vfork();if(val == 0) {++A, ++B;printf("A: %d , B: %d\n", A, B);} else {++A, ++B;printf("A: %d , B: %d\n", A, B);}}

image-20231121150436009

如果将vfork换为fork

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int A = 0;
int B = 0;
int main()
{pid_t val;val = fork();if(val == 0) {++A, ++B;printf("A: %d , B: %d\n", A, B);} else {++A, ++B;printf("A: %d , B: %d\n", A, B);}}

image-20231121150526469

可以发现:vfork创建的子进程与父进程共享地址空间。

相关文章:

Linux fork和vfork函数用法

fork和vfork是用于创建新进程的函数&#xff0c;在Linux的C语言编程中非常常见。 fork函数 fork函数是用于创建一个新的进程&#xff0c;新进程是调用进程的副本。新进程将包含调用进程的地址空间、文件描述符、栈和数据。在fork之后&#xff0c;父进程和子进程将并发执行。 …...

Oracle Data Redaction和Oracle Data Pump

本实验的使用环境基于之前的博客&#xff1a;一个简单的Oracle Redaction实验 本实验参考文档为15.14 Oracle Data Redaction and Oracle Data Pump 先创建directory并赋权&#xff1a; -- connect to database or pluggable database alter session set containerorclpdb1;…...

python django 小程序图书借阅源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

CI/CD --git版本控制系统

目录 一、git简介 二、git使用 三、github远程代码仓库 一、git简介 Git特点&#xff1a; 速度简单的设计对非线性开发模式的强力支持&#xff08;允许成千上万个并行开发的分支&#xff09;完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目&#xff08;速度和数…...

CSS中2种复合选择器

1:交集选择器 作用&#xff1a;选中同时符合多个条件的元素 语法&#xff1a;选择器1选择器2选择器n{} 注意&#xff1a;若交集选择器中有元素选择器&#xff0c;必须使用元素选择器开头 2:并集选择器 作用&#xff1a;同时选择多个选择器对应的元素 语法&#xff1a;选择…...

【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用

文章目录 写在前面开发环境搭建skynet配置文件项目&#xff0c;启动&#xff01; debug console 写在前面 本系列【Skynet 入门实战练习】所有源码同步&#xff1a;https://gitee.com/Cauchy_AQ/skynet_practice 开发环境搭建 skynet skynet 框架地址&#xff1a;https://g…...

【探索嵌入式虚拟化技术与应用】— 虚拟化技术深入浅出自学系列

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:【探索嵌入式虚拟化技术与应用】&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 一、虚拟技术的发展历史 1.1传统技术的局限性&#xff1a; ​编辑 1.2云计算和万物互联技术的发展机遇&#x…...

MIB 6.1810实验Xv6 and Unix utilities(5)find

难度:moderate Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution should be in the file user/find.c. 题目要求&#xff1a;实现find &#xff0c;即在某个路径中&#xff0c;找出某…...

百度爬虫的工作原理解析

百度作为中国最大的搜索引擎&#xff0c;其工作原理备受关注。本文将深入探讨百度爬虫的工作原理&#xff0c;介绍其基本流程以及关键技术&#xff0c;帮助读者更好地理解搜索引擎背后的技术核心。 百度爬虫是百度搜索引擎的重要基石&#xff0c;它们被广泛用于收集互联网上的网…...

Linux入门必备指令

Linux学习之路起始篇——Linux基本指令 文章目录 Linux学习之路起始篇——Linux基本指令**一、ls指令****二、pwd命令****三、cd命令****四、touch指令****五、mkdir命令****六、rm命令****七、man 命令****八、cp命令****九、mv命令****10、cat 指令****十一、tac命令** 前言&…...

linux系统环境下mysql安装和基本命令学习

此篇文章为蓝桥云课--MySQL的学习记录 块引用部分为自己的实验部分&#xff0c;其余部分是课程自带的知识&#xff0c;链接如下&#xff1a; MySQL 基础课程_MySQL - 蓝桥云课 本课程为 SQL 基本语法及 MySQL 基本操作的实验&#xff0c;理论内容较少&#xff0c;动手实践多&am…...

Monitor 原理

每个 Java 对象都可以关联一个 Monitor 对象&#xff0c;如果使用 synchronized 给对象上锁&#xff08;重量级&#xff09;之后&#xff0c;该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。 Monitor组成内容 EntryList&#xff08;入口列表&#xff09; 当一个线…...

Java核心知识点整理大全7-笔记

目录 4.1.9. JAVA 锁 4.1.9.1. 乐观锁 4.1.9.2. 悲观锁 4.1.9.3. 自旋锁 4.1.9.4. Synchronized 同步锁 Synchronized 作用范围 Synchronized 核心组件 Synchronized 实现 4.1.9.5. ReentrantLock Lock 接口的主要方法 非公平锁 公平锁 ReentrantLock 与 synchronized …...

Flink Operator 使用指南 之 全局配置

背景 在上一个章节中已经介绍了基本的Flink-Operator安装,但是在实际的数据中台的项目中,用户可能希望看到Flink Operator的运行日志情况,当然这可以通过修改Flink-Operator POD的文件实现卷挂载的形势将日志输出到宿主机器的指定目录下,但是这种办法对数据中台的产品不是…...

手把手教你通过CODESYS V3进行PLC编程(一)

教程背景 宏集MC系列模块化控制器是基于Raspberry Pi的高性能4核控制器&#xff0c;运动控制循环时间最快可达500微秒&#xff0c;实现了计算能力和成本之间的最佳平衡&#xff0c;适用于多轴运动控制和CNC控制。 教程目的 本系列教程将使用宏集MC系列控制器&#xff0c;详细…...

《算法通关村—进制转换问题处理模板》

《算法通关村—进制转换问题处理模板》 先来一个题热热身 504. 七进制数 给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: "202"示例 2: 输入: num -7 输出: "-10"提示&#xff1a; …...

python接口自动化测试之接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…...

s28.CentOS、Ubuntu、Rocky Linux系统初始化脚本v6版本

CentOS、Ubuntu、Rocky系统初始化脚本 Shell脚本源码地址&#xff1a; Gitee&#xff1a;https://gitee.com/raymond9/shell Github&#xff1a;https://github.com/raymond999999/shell 可以去上面的Gitee或Github仓库代码拉取脚本。 版本功能v6版更新内容1.由于CentOS 6…...

go同步锁 sync mutex

goroutine http://127.0.0.1:3999/concurrency/11 go tour 到此 就结束了. 继续 学习 可以 从 以下网站 文档 https://golang.org/doc/ https://golang.org/doc/code https://golang.org/doc/codewalk/functions/ 博客 https://go.dev/blog/ wiki 服务器教程 服务器…...

使用项目自动生成的dokcerfile第一次构建时把加载aps5.0失败无法找到加载的文件

第一次构建初始化项目自带的dockerfile,内容如下: #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.#FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base #WORKDIR /a…...

Cursor Rules配置指南:精准控制AI编程助手上下文,提升开发效率

1. 项目概述&#xff1a;Cursor Rules 是什么&#xff0c;以及为什么你需要它如果你是一名开发者&#xff0c;尤其是深度使用 Cursor 这款 AI 编程工具的开发者&#xff0c;那么你很可能已经体会过“上下文混乱”的烦恼。当你打开一个项目&#xff0c;试图让 AI 助手帮你写代码…...

5分钟搞定B站视频转文字:你的终极免费解决方案

5分钟搞定B站视频转文字&#xff1a;你的终极免费解决方案 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 你是否经常遇到这种情况&#xff1f;看到B站上有价…...

解决Conda环境创建中的下载超时问题

引言 在使用Bash脚本创建Conda环境时&#xff0c;经常会遇到下载超时的问题&#xff0c;特别是当你需要下载大量包或者网络连接不稳定时。这种问题不仅影响开发效率&#xff0c;还可能导致整个项目进展的延迟。今天&#xff0c;我们将探讨如何解决这种问题&#xff0c;并通过实…...

CANN/ge Tiling下沉特性分析

Tiling 下沉&#xff08;Tiling Sink&#xff09;特性分析 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型…...

隐私优先的本地化个人基因组分析工具:从数据到洞察的完整指南

1. 项目概述&#xff1a;一个隐私优先的本地化个人基因组分析工具 如果你和我一样&#xff0c;对消费级基因检测报告里那些“你有2.1%的尼安德特人血统”或者“你患某种疾病的风险是平均水平的1.2倍”的模糊描述感到不满足&#xff0c;同时又对将原始DNA数据上传到云端心存顾虑…...

Python如何下载文件:从基础到进阶的完整指南

在Python中下载文件是一项常见任务&#xff0c;无论是从网页下载图片、文档&#xff0c;还是通过API获取数据&#xff0c;掌握文件下载技术都是开发者的必备技能。本文将系统介绍Python下载文件的多种方法&#xff0c;涵盖基础实现、高级技巧和常见问题解决方案。一、基础方法&…...

AI 术语通俗词典:梯度下降

梯度下降是数学优化、机器学习、深度学习和人工智能中非常常见的一个术语。它用来描述一种通过沿着损失函数下降最快的方向不断调整参数&#xff0c;从而让模型误差逐渐变小的方法。换句话说&#xff0c;梯度下降是在回答&#xff1a;模型已经知道自己错了&#xff0c;那么下一…...

CANN/ATVOSS块调度运行接口

BaseBlockSchedule::Run 【免费下载链接】atvoss ATVOSS&#xff08;Ascend C Templates for Vector Operator Subroutines&#xff09;是一套基于Ascend C开发的Vector算子库&#xff0c;致力于为昇腾硬件上的Vector类融合算子提供极简、高效、高性能、高拓展的编程方式。 项…...

特征河流:面向流式语言理解的增量式变化点检测序列建模 Transformer替代

论文二:特征河流 原创:李金雨 标题建议 《Feature River: Incremental Sequence Modeling via Change-Point Detection for Streaming Language Understanding》 中文标题:《特征河流:面向流式语言理解的增量式变化点检测序列建模》 摘要 (Abstract) 实时语言理解系统…...

大语言模型多智能体系统:架构、应用与挑战

1. 从单兵作战到团队协作&#xff1a;大语言模型多智能体系统的演进与核心架构如果你在过去一年里深度使用过ChatGPT、Claude或者国内的文心一言、通义千问等大模型&#xff0c;你可能会有一个直观的感受&#xff1a;单个大模型在回答具体问题、生成文本或代码片段时已经相当出…...