进程的创建

news2024/12/22 22:13:31

进程创建时发生了什么

回顾上节关于存储空间分配的图片:

当程序运行到 fork() 函数了之后:

  • 在早期的Linux中,系统会将fork之前所有的数据段,代码段,堆,栈等对应的全部的存储空间拷贝一份,作为子进程的数据段,并共享正文段,称为全拷贝
  • 在之后,系统经过优化,fork函数执行后,对于没有修改过的数据,采用了共享存储空间的方法,只将变化部分的代码拷贝,同时也共享正文段,称为写时拷贝(Copy-On-Write, COW)

创建子进程的目的 

创建进程使用的函数

fork函数:

需要添加的库:

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

函数原型:

pid_t fork(void);
  • 如果fork函数调用成功,则返回两次:
  1. 返回值为0,代表当前进程为子进程
  2. 返回值为非负数,代表当前进程为父进程
  • 如果fork函数调用失败,则返回-1 

实操演示

在Linux环境中的"./home"下创建“JC”文件夹,关于进程学习的代码都放在这里

demo1.c:

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


int main()
{
	pid_t pid;
	pid_t fork_return;

	pid = getpid();
	printf("before fork, PID = %d\n",pid);

	fork_return = fork();

	if(fork_return > 0){
		printf("This is the father JC,PID = %d\n",getpid()); //这句话父进程会执行
	}else{
		printf("This is the son JC,PID = %d\n",getpid()); //这句话子进程会执行
	}


	return 0;
}

运行代码:

由此可见,在fork之前,只有一个进程,在fork之后,原来的进程变成了父进程,并创建了一个子进程,所以在fork之后的代码父子进程都会执行,并根据fork的返回值来打印不同的语句。

而如果打印fork函数返回的“fork_return”,就会发现,父进程打印的fork_return其实就是子进程的PID号,而子进程打印的fork_return就是0。侧面印证了fork函数的返回值,大于0对应父进程

vfork函数:

vforkfork 的区别:

  • vfork直接使用父进程的存储空间,不进行拷贝
  • vfork保证子进程先运行,当子进程调用exit退出后,父进程才进行

需要添加的库:(和fork相同)

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

函数原型:(除了名字都和fork相同)

pid_t vfork(void);
  • 如果vfork函数调用成功,则返回两次:
  1. 返回值为0,代表当前进程为子进程
  2. 返回值为非负数,代表当前进程为父进程
  • 如果vfork函数调用失败,则返回-1 

实操演示

demo2.c:

为了展示区别,先用fork写一段代码:

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


int main()
{
	pid_t pid;
	pid_t fork_return;

	pid = getpid();
	printf("before fork, PID = %d\n",pid);

	fork_return = fork();

	if(fork_return > 0){
		while(1){
			printf("This is the father JC,PID = %d\n",getpid());
			sleep(2);
		}
	}else{
		while(1){
			printf("This is the son JC,PID = %d\n",getpid());
			sleep(2);
		}
	}


	return 0;
}

运行代码1:

可见,父子进程基本交替在运行。 

此时,修改demo2, 将fork改为vfork。

fork_return = vfork();

运行代码2:

可见,由于子进程没有exit,所以父进程不会进行,只有子进程一直在运行

而此时在子进程中添加退出的代码:

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


int main()
{
	pid_t pid;
	pid_t fork_return;
	int cnt = 0;

	pid = getpid();
	printf("before fork, PID = %d\n",pid);

	fork_return = vfork();

	if(fork_return > 0){
		while(1){
			printf("This is the father JC,PID = %d\n",getpid());
			sleep(2);
		}
	}else{
		while(1){
			printf("This is the son JC,PID = %d\n",getpid());
			sleep(2);
			cnt++;
			if(cnt == 3){
				exit(-1);
			}
		}
	}


	return 0;
}

运行代码3:

此时,子进程运行三次之后就会自动退出,父进程就会开始一直运行。 

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

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

相关文章

保姆级教程:从0到1搭建Stable Diffusion XL完整工作流进行AI绘画

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【人人都是算法专家】栏目专注于分享Rocky在AI行业中对业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rocky。 之前Rocky详细介绍了Stable Diffusion&#xff08;SD&#…

Scala(第一章Scala入门)

文章目录 1.1 概述 1.1.1 为什么学习Scala1.1.2 Scala发展历史1.1.3 Scala和Java关系1.1.4 Scala语言特点 1.2 Scala环境搭建1.3 Scala插件安装1.4 HelloWorld案例 1.4.1 创建IDEA项目工程1.4.2 class和object说明1.4.3 Scala程序反编译 1.5 关联Scala源码1.6官方编程指南 1.1…

Arch Linux 使用桥接模式上网

如果我们想要将虚拟机与物理主机同一网段&#xff0c;并且像物理机器一样被其他设备访问&#xff0c;则需要以桥接模式上网&#xff0c;这个时候&#xff0c;物理主机就必须配置为使用网桥上网了。 注意&#xff1a;这里我们使用了 NetworkManager 网络管理工具中的 nmcli 来进…

File 类和 InputStream, OutputStream 的用法总结

目录 一、File 类 1.File类属性 2.构造方法 3.普通方法 二、InputStream 1.方法 2.FileInputStream 三、OutputStream 1.方法 2.FileOutputStream 四、针对字符流对象进行读写操作 一、File 类 1.File类属性 修饰符及类型属性说明static StringpathSeparator依赖于系统的路…

【T3】金蝶kis凭证数据转换到畅捷通T3软件中。

【问题需求】 将金蝶软件中的账套转换到畅捷通T3软件中。 由于金蝶老版本使用的是非sql server数据库。 进而需要将其数据导入到sql中,在转换到T3。 【转换环境】 金蝶中数据:凭证;科目无项目核算。 1、金蝶的数据文件后缀为.AIS; 2、安装office2003全版软件; 3、安装sq…

SpringBoot3文件管理

标签&#xff1a;上传.下载.Excel.导入.导出&#xff1b; 一、简介 在项目中&#xff0c;文件管理是常见的复杂功能&#xff1b; 首先文件的类型比较多样&#xff0c;处理起来比较复杂&#xff0c;其次文件涉及大量的IO操作&#xff0c;容易引发内存溢出&#xff1b; 不同的…

Codeforces Round 890 (Div. 2) C. To Become Max(二分 补写法 二分套二分)

题目 给定一个长度为n(n<1e3)的数组&#xff0c; 在一次操作里&#xff0c;你可以选择一个满足a[i]<a[i1]的下标i(1<i<n-1)&#xff0c;对a[i]加一 问&#xff0c;你最多操作k次的情况下&#xff0c;数组的最大值是多少&#xff0c;输出最大值 思路来源 Submi…

【C++精华铺】5.C++类和对象(中)类的六个默认成员函数

目录 1. 六个默认成员函数 2. 构造函数 2.1 概念 2.2 默认构造 2.2.1 系统生成的默认构造 2.2.2 自定义默认构造函数 2.3 构造函数的重载 3. 析构函数 3.1 概念 3.2 系统生成的析构函数 3.3 自定义析构函数 4. 拷贝构造 4.1 概念 4.2 默认生成的拷贝构造&#xff08;浅…

解锁滴滴ES的性能潜力:JDK 17和ZGC的升级之路

前文介绍了滴滴自研的ES强一致性多活是如何实现的&#xff0c;其中也提到为了提升查询性能和解决查询毛刺问题&#xff0c;滴滴ES原地升级JDK17和ZGC&#xff0c;在这个过程中我们遇到了哪些问题&#xff0c;怎样解决的&#xff0c;以及最终上线效果如何&#xff0c;这篇文章就…

云计算技术——多GPU渲染的云渲染服务

多GPU渲染的云渲染服务&#xff0c;是一种利用云计算技术&#xff0c;将多个图形处理器&#xff08;GPU&#xff09;集成在一起&#xff0c;为用户提供高效、便捷、低成本的渲染解决方案的服务。本文将从多GPU渲染的概念、优势、应用场景&#xff0c;云渲染服务的特点、优势&am…

【C++】初阶 --- 内联函数(inline)

文章目录 &#x1f95e;内联函数&#x1f35f;1、C语言实现"宏函数"&#x1f35f;2、内联函数的概念&#x1f35f;3、内联函数的特性&#x1f35f;4、总结 &#x1f95e;内联函数 &#x1f35f;1、C语言实现"宏函数" &#x1f970;用C语言先来实现普通的…

并发——volatile 关键字

文章目录 1. CPU 缓存模型2. 讲一下 JMM(Java 内存模型)3. 并发编程的三个重要特性4. 说说 synchronized 关键字和 volatile 关键字的区别 我们先要从 CPU 缓存模型 说起&#xff01; 1. CPU 缓存模型 为什么要弄一个 CPU 高速缓存呢&#xff1f; 类比我们开发网站后台系统使…

分布式 - 服务器Nginx:一小时入门系列之静态网页配置

文章目录 1. 静态文件配置2. nginx listen 命令解析3. nginx server_name 命令解析4. nginx server 端口重复5. nginx location 命令 1. 静态文件配置 在 /home 文件下配置一个静态的AdminLTE后台管理系统&#xff1a; [rootnginx-dev conf.d]# cd /home [rootnginx-dev home…

flutter项目给安卓打正式包 和升级版本号

1.首先把flutter项目里的android目录整个拖进android studo里,运行一下看看是否能运行 2.Build->Generate Signed Bundle/APK… 点击APK->Next 如果没有key酒店及Create new…就生成新的key 点击Key store path:右边的图标选择保存路径 选择保存的路径,并且在Save…

【雕爷学编程】Arduino动手做(01)---干簧管传感器模块4

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

logo一键生成的操作,没有设计经验也无妨

您可能会担心&#xff0c;没有设计经验如何设计一个独特而专业的标志&#xff08;Logo&#xff09;。但是&#xff0c;随着技术的进步&#xff0c;现在有许多一键生成操作的设计工具可供使用&#xff0c;使人们更容易创建自己的Logo。 什么是一键生成操作&#xff1f; 一键生成…

若依vue -【 100 ~ 更 】

100 主子表代码生成详解 1 新建数据库表结构&#xff08;主子表&#xff09; -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

《大型网站技术架构》第二篇 架构-高可用

高可用在公司中的重要性 对公司而言&#xff0c;可用性关系网站的生死存亡。对个人而言&#xff0c;可用性关系到自己的绩效升迁。 工程师对架构做了许多优化、对代码做了很多重构&#xff0c;对性能、扩展性、伸缩性做了很多改善&#xff0c;但别人未必能直观地感受到&#…

字节编码学习

字节编码学习 文章目录 字节编码学习01_字节与ASCII码表02_每个国家都有独特的码表03_国际化UTF-804_编码本和解码本不一致&#xff0c;乱码 01_字节与ASCII码表 public class Demo01 {public static void main(String[] args) {// 计算机的底层全部都是字节 ---- ----// 一个…

Android Studio实现简单ListView

效果图 MainActivity package com.example.listviewtest;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.widget.ListView;import com.example.listviewtest.adapter.PartAdapter; import com.example.listviewtest.bean.PartB…