fork函数如何创建进程,exit/_exit函数如何使进程终止的详细分析与代码实现
🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏
🪔本系列专栏 - 并发与进程通信
🍻欢迎大家 🏹 点赞👍 评论📨 收藏⭐️
📌个人主页 - 勾栏听曲_0的博客📝
🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆
🎇我见青山多妩媚,料青山见我应如是。📈
目录
fork创建进程
介绍
接口
代码实例
思考
终止进程
exit/_exit函数
接口
代码实例
fork创建进程
介绍
fork用来创建一个新进程(child proccess),你要创建一个新进程,首先得知道一个进程中都包含上面东西。
系统数据
用户数据
指令
fork一个新进程时,这个新进程的 数据 和 指令 来源于哪里呢?
来源于它爸爸(父进程,调用fork的那个进程)
fork这个函数在创建子进程时,都复制了父进程的哪些内容呢:
copy了父进程的数据和指令!!!
父进程的变量,数据对象,
标准IO缓冲区
文件描述符
...
copy完了后,父子进程就独立啦。
通过fork的不同的返回值,来区分到底是父进程返回,还是子进程返回。
接口
头文件
#include <sys/types.h>
#include <unistd.h>
函数功能
创建一个子进程
函数原型
pid_t fork(void);
函数参数
无
函数返回值
如果失败返回-1,同时errno被设置。
如果成功:
父进程返回 子进程的pid( > 0)
子进程返回 0
代码实例
以下是获取自己的进程ID与获取父进程的IP的函数
头文件
#include <sys/types.h>
#include <unistd.h>
函数原型
pid_t getpid(void); //用于获取自己的进程pid
pid_t getppid(void); //用于获取父进程的pid
以下代码实现创建一个子进程,并且父子进程分别输出自己的id。
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{pid_t pid = fork();if(-1 == pid){perror("fork failed!");return -1;}else if(0 == pid) //子进程{printf("这是子进程,我的ID为%d\n",getpid());printf("这是子进程,我的父进程ID为%d\n",getppid());}else if(pid > 0){printf("这是父进程,我的ID为%d\n",getpid());printf("这是父进程,我的子进程ID为%d\n",pid);printf("这是父进程,我的父进程ID为%d\n",getppid());;}return 0;
}
思考
(1) fork一旦成功,就会有父进程和子进程,那么fork之后,到底是父进程先执行,还是子进程先执行呢?
(2)fork子进程会拷贝父进程的指令和数据,它到底拷贝了父进程哪些数据呢?
a:父进程全部的用户数据
b:父进程打开的文件描述符及状态
c:标准IO的缓冲区
d:信号的处理方式
(3)fork之后的子进程与父进程有什么区别?
进程ID不同。子进程可以通过getpid()函数获取自己的进程ID,可以通过getppid()函数获取父进程的进程ID。
子进程中的tms_utime tms_stime tms_cutime 和 tms_ustime的值设为0。
子进程不继承父进程设置的文件锁,但继承了父进程中的所有互斥锁、读写锁和条件变量(包括它们的状态)。
子进程拥有自己独立的地址空间,但是在fork之后exec之前两个进程用的是同一份物理页面。
子进程的执行顺序和父进程是不确定的,取决于系统调度。
终止进程
进程的终止一般有两种情况:第一是自己退出,常见的方法为main函数返回值,程序退出。第二种情况就是调用一些进程退出函数执行终止进程,例如exit/_exit函数与wait/waitpid函数。接下来外面就重点来讲解这两类程序退出函数。
exit/_exit函数
exit函数和_exit函数都是用来终止进程的,但它们有以下区别:
exit函数在终止进程之前,会先执行一些清理操作,比如调用atexit注册的函数,刷新所有文件缓冲区,关闭所有打开的文件描述符,销毁线程本地对象等。_exit函数则直接进入内核,不做任何清理操作。
exit函数的参数是一个无符号整型,表示进程的退出状态,只有第八位有效(0-255),超出255将表示未定义退出状态值。_exit函数的参数是一个整型,表示进程的退出状态,但不一定是0-255。
exit函数是标准C库函数,定义在<stdlib.h>头文件中。_exit函数是POSIX系统调用,定义在<unistd.h>头文件中。
接口
头文件
#include <stdlib.h>
函数功能
让进程退出,正常退出,做一些清理工作(如:把缓冲区的内容,同步到文件中去)
函数原型
void exit(int status);
函数参数
int status //表示退出码,表示退出状态,退出码的具体含义,由程序员来解释。
函数返回值
无
头文件
#include <unistd.h>
函数功能
_exit 坐火箭走的,让中止进程,来不及做清理工作
函数原型
void _exit(int status);
函数参数
int status //表示退出码,表示退出状态,退出码的具体含义,由程序员来解释。
函数返回值
无
代码实例
你可以使用命令行参数来指定文件名和打开模式,然后根据模式来调用exit()函数或_exit()函数。例如,你可以输入./a.out test.txt w
来打开test.txt文件并写入内容,或者输入./a.out test.txt r _exit
来打开test.txt文件并读取内容,然后调用_exit()函数。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{if (argc < 3) // 检查命令行参数是否足够{printf("Usage: %s filename mode [exit_mode]\n", argv[0]); // 输出用法提示return 1;}char *filename = argv[1]; // 获取文件名char *mode = argv[2]; // 获取打开模式char *exit_mode = argv[3]; // 获取退出模式FILE *fp = fopen(filename, mode); // 打开文件if (fp == NULL) // 检查文件是否打开成功{printf("Cannot open file %s\n", filename); // 输出错误信息return 2;}if (strcmp(mode, "w") == 0) // 如果是写入模式{printf("Writing to file %s\n", filename); // 输出提示信息fprintf(fp, "Hello, file!\n"); // 写入内容到文件}else if (strcmp(mode, "r") == 0) // 如果是读取模式{printf("Reading from file %s\n", filename); // 输出提示信息char buffer[100]; // 定义缓冲区while (fgets(buffer, 100, fp) != NULL) // 循环读取文件内容{printf("%s", buffer); // 输出文件内容到标准输出}}else // 如果是其他模式{printf("Invalid mode %s\n", mode); // 输出错误信息fclose(fp); // 关闭文件return 3;}fclose(fp); // 关闭文件if (exit_mode != NULL && strcmp(exit_mode, "_exit") == 0) // 如果指定了_exit()函数{_exit(0); // 调用_exit()函数}else // 否则{exit(0); // 调用exit()函数}}
相关文章:

fork函数如何创建进程,exit/_exit函数如何使进程终止的详细分析与代码实现
🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列…...

重置电脑时提示“缺少所需的驱动器分区”怎么办?
当您启动Windows 10电脑并收到“您的电脑/设备需修复”这个消息提示时,您会马上尝试修复电脑,如果您这样做了,您可能会收到一个“安装Windows的驱动器已被锁定”的信息。如果您尝试重置您的电脑,您可能会收到一条提示,…...

在KylinV10安装Dm8
前言 因为近期,业外和几个朋友想搞点有趣的项目玩玩,既然不以盈利为主,就> 主推国产化,所以这篇记录一下,我在KylinV10安装dm8.最近真的很忙,要负责专研一下国产化工具开发的事,还要负责tb级…...
「SQL面试题库」 No_46 交换工资
🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试࿰…...

SLAM论文速递【SLAM—— RDS-SLAM:基于语义分割方法的实时动态SLAM—4.24(1)
论文信息 题目: RDS-SLAM:Real-Time Dynamic SLAM Using Semantic Segmentation Methods RDS-SLAM:基于语义分割方法的实时动态SLAM论文地址: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9318990发表期刊: IEEE Access ( Volum…...

OJ练习第82题——填充书架
填充书架 力扣链接:1105. 填充书架 题目描述 给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架…...
OHOS IDE和SDK的安装方法
参照OpenHarmony应用开发环境安装流程,下载安装OHOS的IDE,过程中需要全程联网。 IDE,安装至D:\Tools\Huawei\DevEcoStudio。 IDE安装成功之后,按照提示下载安装HOS和OHOS的SDK。 nodejs,安装至D:\Tools\Huawei\nodejs…...
New Year Garland(计数类DP)
New Year Garland 题意 用m种颜色的球装饰n层的圣诞树,圣诞树的第i层由 l i l_{i} li个彩球串成,且同一层相邻的球颜色不同,相邻的层之间彩球颜色的集合不同,问有多少种方案,对p取模。 分析 首先先计算每一…...

32岁阿里P7,把简历改成不知名小公司,学历改成普通本科,工作内容不变,投简历全挂!...
hr靠什么来招人? 一位猎头讲述了自己和朋友打赌的故事: 朋友在阿里云,32岁,P7,他把简历上的公司改成不知名,学历改成普通本科,工作内容不变,结果投其他公司(比如京东&…...

从三室心脏MRI影像检测主动脉瓣病变
Detecting Aortic Valve Pathology from the 3-Chamber Cine Cardiac MRI View 摘要 背景 心脏磁共振(CMR)是量化心脏容量、功能和血流量的金标准。定制的MR脉冲序列定义了对比机制,采集几何形状和定时,可以在CMR期间应用,以实现独特的组织…...

【JavaWeb】JavaScript
1、JavaScript 介绍 Javascript 语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行 JavaScript 代码。 JS 是 Netscape 网景公司的产品,最早取名为 LiveScript;为了吸引更多 java 程序员。更名为 JavaScript。 JS 是弱…...
Apache Doris 1.2.4 Release 版本正式发布|版本通告
亲爱的社区小伙伴们,我们很高兴地宣布,Apache Doris 于 2023 年 4 月 27 日迎来 1.2.4 Release 版本的正式发布!在 1.2.4 版本中,Doris 团队已经修复了自 1.2.3 版本发布以来近 150 个问题或性能改进项。同时,1.2.4 版…...

【C++STL】map
文章目录 一. map的介绍二. map的使用结束语 一. map的介绍 map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素在map中,键值key通常用于排序和唯一地标识元素,而value中存储与此键值…...
vue2项目PC端如何适配不同分辨率屏幕
项目构建:基于vue-cli3构建,使用postcss-px2rem px2rem-loader进行rem适配 实现原理:每次打包,webpack通过使用插件postcss-px2rem,帮我们自动将px单位转换成rem单位前方有坑:UI框架部分组件使用JavaScript…...

CorelDRAW2023最新版本图像设计软件
CorelDRAW 2023作为最新版的图像设计软件,在功能上做了较大提升,主要新的功能特性如下: 1. 全新界面设计:采用简约现代的 UI 设计,菜单和工具重新组织,更加直观易用。提供自动提示与设计指导,易于上手。 2. 智能工具与提示:运用 AI技术对用户操作行为和设计习惯进行分析,给出…...

第64章 树型结构数据的前端渲染渲染显示示例
1 \src\views\TreeTestView.vue <template> <div class"wrap"> <!--注意:1、“回到顶部”组件及其回滚内容都必须包含到同1个div容器中。--> <!-- 2、div容器中必须有1个唯1性的样式类(例如:wrap)…...

超级国际象棋:第二个里程碑已完成
获取Cartesi资助的项目的最新进展,现在将完全去中心化的Web3国际象棋带到你的手中 “Ultrachess是一个完全基于区块链的国际象棋应用程序,由Cartesi Rollup技术支持,允许用户将真实价值投入到比赛中,不仅仅是他们的Elo分数。 此…...
vue3 HTML 和静态资源
目录 静态资源可以通过两种方式进行处理: URL 转换规则 public 文件夹 何时使用 public 文件夹 public/index.html 文件是一个会被 html-webpack-plugin 处理的模板。在构建过程中,资源链接会被自动注入。另外,Vue CLI 也会自动注入 re…...

5G基站外市电改造建设方案 (ppt可编辑)
本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 外市电定义及分类 定义:由供电部门提供的专用高压电源或非专用高压电源或低压电源均称为市电。分类: (1)按电压等级分类 ①提供…...

C++ 类和对象(上)
类 面向对象的三大特性:封装,继承,多态 C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语言方式实现的栈,…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...