当前位置: 首页 > 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创建的子进程与父进程共享地址空间。

http://www.lryc.cn/news/237820.html

相关文章:

  • Oracle Data Redaction和Oracle Data Pump
  • python django 小程序图书借阅源码
  • CI/CD --git版本控制系统
  • CSS中2种复合选择器
  • 【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用
  • 【探索嵌入式虚拟化技术与应用】— 虚拟化技术深入浅出自学系列
  • MIB 6.1810实验Xv6 and Unix utilities(5)find
  • 百度爬虫的工作原理解析
  • Linux入门必备指令
  • linux系统环境下mysql安装和基本命令学习
  • Monitor 原理
  • Java核心知识点整理大全7-笔记
  • Flink Operator 使用指南 之 全局配置
  • 手把手教你通过CODESYS V3进行PLC编程(一)
  • 《算法通关村—进制转换问题处理模板》
  • python接口自动化测试之接口数据依赖
  • s28.CentOS、Ubuntu、Rocky Linux系统初始化脚本v6版本
  • go同步锁 sync mutex
  • 使用项目自动生成的dokcerfile第一次构建时把加载aps5.0失败无法找到加载的文件
  • ACREL DC energy meter Application in Indonesia
  • 报错!Jupyter notebook 500 : Internal Server Error
  • 2023.11.21使用<button>元素来触发form表单和数据提交
  • leetcode:504. 七进制数
  • centos安装指定版本docker
  • PPT幻灯片里的图片,批量提取
  • 《Fine-Grained Image Analysis with Deep Learning: A Survey》阅读笔记
  • 【网络安全】伪装IP网络攻击的识别方法
  • redis非关系型数据库
  • LeetCode 0053. 最大子数组和:DP 或 递归(线段树入门题?)
  • 二十三种设计模式全面解析-解密职责链模式:请求处理的设计艺术