嵌入式开发之进程函数

1、进程创建-fork

#include <unistd.h>

pid_t fork(void);

  • 创建新的进程,失败时返回-1
  • 成功时父进程返回子进程的进程号,子进程返回0
  • 通过fork的返回值区分父进程和子进程
pid_t pid;
//fork子进程之后,子进程和父进程会同时继续往下执行,因此子进程执行的以下代码,打印pid只会是0,而父/进程则会打印子进程的正整数的pid
if((pid = fork())<0)
{perror("fork");return -1;
}
else if(pid == 0){printf("child process:my pid is %d\n",getpid());
}else{printf("parent process: my pid is %d\n",getpid());
}

(1)子进程继承父进程的内容;

(2)父子进程有独立的地址空间,互相不影响;

(3)若父进程先结束,

  • 子进程成为孤儿进程,被init进程收养,linux 内核启动之后创建的第一个用户态进程,进程号1。系统规定每个进程结束的时候,必须由父进程回收。一个进程进程号pid不会变的,但是父进程号有可能会改变的。
  • 子进程变成后台进程

(4)若子进程先结束

  • 父进程如果没有及时回收,子进程变成僵尸进程(当进程结束,PCB没有被释放返回值和结束方式,必须父进程回收)

请参考《嵌入式开发之进程回收》icon-default.png?t=O83Ahttps://blog.csdn.net/qq_22111417/article/details/143466320?sharetype=blogdetail&sharerId=143466320&sharerefer=PC&sharesource=qq_22111417&sharefrom=mp_from_link 

1.1、思考

1、问:子进程从何处开始运行?

答:子进程从fork的下一条指令开始执行。PC的程序寄存器也被继承过来了。子进程不执行fork。

2、问:父子进程谁先执行?

答:linux没有规定哪个先执行,依赖内核的调度。父进程的时间片没有用完,通常父进程先执行。不确定。

3、问:父进程能否多次调用fork?子进程呢?

答:可以,父进程没有限制多次创建子进程。子进程可以创建fork。

2、进程结束- exit/_exit

#include <stdlib.h>

void exit(int status);

#include <unistd.h>

void _exit(int status);

  • status:整型的数值,只有低8位有效的
  • 结束当前的进程并将status返回
  • exit结束进程时会刷新(流)缓冲区,_exit不会刷新缓冲区,会被丢弃
/**
除了遇到换行符\n外,缓冲区刷新的其他条件还包括:(‌1)进程结束‌:当程序正常结束时,缓冲区的内容会被刷新并显示‌。
‌(2)缓冲区满‌:当缓冲区满时,内容也会被刷新并显示‌。
‌(3)手动刷新‌:可以使用fflush(stdout)函数手动刷新缓冲区‌。
‌(4)调用exit(0)‌:使用exit(0)函数时,缓冲区也会被刷新‌
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(void){printf("using exit...\n");//遇到换行符会立即刷新缓冲区printf("this process will eixt"); exit(0); //遇到exit结束程序会刷新缓冲区//_exit(); //直接结束进程,不会刷新缓冲区printf("never be displayed");
}

补充

当父进程没有及时回收子进程时,可以通过以下方法保证子进程不成为僵尸进程:

  1. 使用信号处理机制:父进程可以使用SIGCHLD信号来捕获子进程的退出事件,并在信号处理函数中调用wait()waitpid()来回收子进程资源。

  2. 设置SA_NOCLDWAIT标志:父进程可以通过设置SA_NOCLDWAIT标志来告诉操作系统不要将已终止子进程保留为僵尸进程。可以使用sigaction()函数来设置信号处理动作。

  3. 创建孤儿进程:父进程在创建子进程后,可以通过调用setsid()函数创建一个新的会话,并使子进程成为该会话的领导者。这样即使父进程退出,子进程也会被init进程接管,不会成为僵尸进程。

  4. 使用waitpid()函数的WNOHANG选项:父进程可以通过调用waitpid()函数并指定WNOHANG选项来非阻塞地回收子进程资源,即使子进程还未退出也可以得到子进程的状态。

  5. 终止或重启父进程:当父进程终止或重启时,操作系统会将父进程ID为1的init进程接管子进程,从而避免子进程成为僵尸进程。

综上所述,通过合理使用信号处理机制、设置标志、创建孤儿进程、调用waitpid()函数和终止或重启父进程等方法,可以保证子进程不会成为僵尸进程。

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

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

相关文章

【循环引用及格式化输出】

垃圾回收机制 当一个值在内存中直接引用跟间接引用的量为0时&#xff0c;&#xff08;即这个值没有任何入口可以找到它&#xff09;那么这个值就会被清空回收♻️&#xff0c;释放内存空间&#xff1b; 列表在内存中的存储方式 1&#xff09;引用计数的两种方式 x "ea…

从0开始学习Linux——文本编辑器

往期目录&#xff1a; 1、从0开始学习Linux——Linux简介&安装 2、从0开始学习Linux——搭建属于自己的Linux系统 我们通过前面教程的学习已经了解了什么是Linux&#xff0c;并且我们也定制安装了属于我们自己的一个Linux系统。从这个章节开始我们将开始学习如何去操作Linu…

“北斗三号”如何赋能工业物联网

北斗三号是我国独立自主研发的第三代卫星导航系统&#xff0c;是北斗卫星导航系统的重要组成部分。北斗三号系统具有全球覆盖能力&#xff0c;除了提供基本的定位、导航、授时服务外&#xff0c;还提供高精度和短报文通信服务等。针对产业物联网应用&#xff0c;北斗三号也发挥…

相关衍生 pika+mongo

衍生相关 pikamongo 很多平台不提供完整的数据展示, 翻页只能翻几页,不过提供相关推荐等方法可获取更多的数据; 使用 rabbitmq 是因为数据量可能有几十上百万, 且能持久化 mongo对于数据并不实时的更新到查询里 def main():# mongodb# client MongoClient(localhost, 27017)cl…

Odoo | 免费开源ERP:汽车及零配件行业信息化解决方案

文 / 开源智造 Odoo亚太金牌服务 概述 围绕汽车行业产业链上下游企业的整体业务主线&#xff0c;提供面向汽车主机厂整车个性化制造解决方案&#xff0c;产业链上下游一体化协同解决方案&#xff0c;数字化精益制造解决方案、全价值链质量管理解决方案&#xff0c;数字化运营解…

【Linux】【守护进程】总结整理

守护进程&#xff08;Daemon&#xff09;是运行在后台的进程&#xff0c;通常没有与之关联的控制终端。守护进程在启动后会脱离控制终端&#xff0c;并继续在后台运行&#xff0c;即使用户退出登录或者终端关闭也不会影响它们的运行。守护进程常用于提供网络服务、定期执行任务…

vue中html如何转成pdf下载,pdf转base64,忽略某个元素渲染在pdf中,方法封装

一、下载 html2Canvas jspdf npm install jspdf html2canvas二、封装转换下载方法 htmlToPdf.js import html2Canvas from html2canvas import JsPDF from jspdf/*** param {*} reportName 下载时候的标题* param {*} isDownload 是否下载默认为下载&#xff0c;传false不…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令&#xff0c;添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令&#xff0c;添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

CSS例子: 横向排列的格子

效果 HTML <view class"content"><view class"item" v-for"item of 5">{{item}}</view></view> CSS .content {height: 100vh;display: flex;flex-direction: row; flex-wrap: wrap;align-content: flex-start;backgro…

智能家居的未来:AI让生活更智能还是更复杂?

内容概要 智能家居的概念源于将各种家居设备连接到互联网&#xff0c;并通过智能技术进行控制和管理。随着人工智能的迅速发展&#xff0c;这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备&#xff0c;智能…

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候&#xff0c;在苹果开发者中心不能直接上传打包文件&#xff0c;需要下载mac的xcode这些工具进行上传&#xff0c;但这些工具无法安装在windows或linux电脑上。 这里&#xff0c;我们可以不用xcode这些工具来上传&#xff0c;可以用国内的香…

ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染

一、组件基础 1.什么是ArkTS ArkTS是HarmoyOS优选的助力应用开发的语言&#xff0c;ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步的扩展&#xff0c;继承了TS所有的特性&#xff0c;是TS的超集。 扩展的能力如下&#xff1a; 基本语法 …

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前&#xff0c;我们先来了解一下搜索 1 搜索是什么 ① 概念&#xff1a;用户输入想要的关键词&#xff0c;返回含有该关键词的所有信息。 ② 场景&#xff1a; ​ 1互联网搜索&#xff1a;谷歌、百度、各种新闻首页&#xff1b; ​ 2 站内搜索&#xff…

大众汽车合肥社招入职笔试测评SHL题库:综合能力、性格问卷、英语口语真题考什么?

大众汽车合肥社招入职笔试测评包括综合能力测试、性格问卷和英语口语测试。以下是各部分的具体内容&#xff1a; 1. **综合能力测试**&#xff1a; - 这部分测试需要46分钟完成&#xff0c;建议准备计算器和纸笔。 - 测试内容涉及问题解决能力、数值计算能力和逻辑推理能力。 -…

Docker-软件容器平台

一、容器 1、什么是容器 容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署 容器镜像是轻量的、可执行的独立软件包 &#xff0c;包含软件运行所需的所有内容&#xff1a;代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于 Linux 和 Windows…

Spring Boot集成Access DB实现数据导入和解析

1.什么是Access DB&#xff1f; microsoft office access是由微软发布的关联式 数据库管理系统。它结合了 microsoft jet database engine 和 图形用户界面两项特点&#xff0c;是一种关系数据库工具。它在很多地方得到广泛使用&#xff0c;例如小型企业&#xff0c;大公司的部…

WSL开发--利用Git连接远程仓库(详细步骤)

这篇文章主要介绍了如何将本地项目推送到 GitLab 上&#xff0c;并且避免每次提交都需要输入用户名和密码。文中分步讲解了配置 GitLab SSH 密钥以及配置 Git 远程仓库地址的方法。以下是文章的优化和简洁版&#xff1a; 将本地项目推送到 GitLab 并配置 SSH 免密登录 为了方便…

快消零售行业企业员工培训的数字化转型

在快速消费品&#xff08;FMCG&#xff09;行业中&#xff0c;员工培训对于保持企业的竞争力至关重要。随着电子商务的兴起和消费者行为的变化&#xff0c;快消零售行业需要不断适应新的市场趋势。数字化转型为员工培训提供了新的机遇&#xff0c;尤其是在构建在线培训知识库方…

java的体系结构

1. 题记&#xff1a; 其实很早就打算来写java的体系结构这一文章&#xff0c;但是有诸多担忧就一直搁置。其一担心自己水平有限&#xff0c;恐不能讲得太透彻&#xff0c;因为java的体系结构宏大精深。其二不知道怎么去把控文章的难度及深度&#xff0c;因为需要给大部分看&am…

基于STM32的实时时钟(RTC)教学

引言 实时时钟&#xff08;RTC&#xff09;是微控制器中的一种重要功能&#xff0c;能够持续跟踪当前时间和日期。在许多应用中&#xff0c;RTC用于记录时间戳、定时操作等。本文将指导您如何使用STM32开发板实现RTC功能&#xff0c;通过示例代码实现当前时间的读取和显示。 环…