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

Linux--进程创建(fork)-退出--孤儿进程

进程创建:
①使用fork函数创建一个进程,创建的新进程被称为子进程。
#include <unistd.h>//头文件
pid_t fork(void);
fork函数调用成功,返回两次:
返回值为0, 代表当前进程为子进程;
返回值为非负数,代表当前进程为父进程(返回新子进程的ID);
调用失败,返回值为-1.

②vfork函数也可以创建进程
区别:
1 、vfork直接使用父进程存储空间,不拷贝。
2 、 vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
fork:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>int main()
{pid_t pid;pid_t pid2;pid_t retpid;pid=getpid();printf("before fork:pid=%d\n",pid);retpid=fork();pid2=getpid();printf("after fork:pid=%d\n",pid2);if(pid==pid2){printf("this is father print:retpid = %d\n",retpid);}else{printf("this is child print,retpid = %d,child pid=%d\n",retpid,getpid());}return 0;
}

vfork:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main()
{pid_t pid;int cnt = 0;pid = vfork();if(pid > 0){while(1){printf("cnt = %d\n",cnt);printf("this is father print:retpid = %d\n",getpid());sleep(1);}}else if(pid == 0){while(1){printf("this is child print:retpid = %d\n",getpid());sleep(1);cnt++;if(cnt = 3){exit(0);}}}return 0;
}

运行结果:

before fork:pid=3082
after fork:pid=3082
this is father print:retpid =3083
after fork:pid=3083
this is child print,retpid = 0,child pid=3083

进程创建时发生什么?
fork调用之后,代码段共享,数据段copy。
不修改变量时,共享变量。修改子进程数据,父进程不改变。

现在很多实现并不执行父进程数据段、栈和堆的完全复制。作为替代,使用了写时复制(Copy-On-Write,COW)技术。
创建子进程的目的
①一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的----父进程等待客户端的服务请求。当这种请求达到时,父进程调用fork,使子进程处理此请求。父进程继续等待下一个服务请求到达。
②一个进程要执行一个不同的程序。这对shell是常见的情况。这种情况下,子进程从fork返回后立即调用exec

进程退出
正常退出:
1.Main函数调用return
2.进程调用exit(),标准c库
3.进程调用_exit()或者_Exit(),属于系统调用
补充:
4.进程最后一个线程返回
5.最后一个线程调用pthread_exit

异常退出:
1.调用abort
2.当进程收到某些信号时,如CTRL+C
3.最后一个线程对取消(cancellation)请求做出响应

对于三个终止(exit、_exit和_Exit),实现这个的方法是,将其退出状态(exit status)作为参数传递给函数。在异常终止时,内核(不是进程本身)产生一个指示其异常终止原因的异常终止状态(termination status)。在任意情况下,该终止进程的父进程都能用wait或waitpid函数取得其终止状态。

父进程等待子进程退出并收集子进程的退出状态
子进程退出状态不被收集,变成僵尸(zombie)进程(僵死进程)
查看ps -aux|grep …,能看到z+(zombie僵死进程)

#include <sys/types.h>
#include <sys/wait.h>pid_t wait(int *status);//地址pid_t waitpid(pid_t pid,int *status,int options);
//参数3一般用:WNOHANG()不阻塞

status参数:是一个整型数指针
非空:子进程退出状态放在它所指向的地址中
空:不关心退出状态
exit正常终止子进程返回的状态,则为真。这种情况需要执行宏WEXITSTATUS(status),取子进程传送给exit、_exit或_Exit参数的低8位。

如果其所有子进程都还在运行,则阻塞;如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回;如果它没有任何子进程,则立即出错返回.

waitpid()有一个选项(options)可以使其不阻塞

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main()
{pid_t pid;int cnt = 0;int status = 10;pid = fork();if(pid > 0){wait(&status);printf("child quit! child status = %d\n",WEXITSTATUS(status));while(1){printf("cnt = %d\n",cnt);printf("this is father print:retpid = %d\n",getpid());sleep(1);}}else if(pid == 0){while(1){printf("this is child print:retpid = %d\n",getpid());sleep(1);cnt++;if(cnt = 5){exit(3);}}}return 0;
}

结果如下:
this is child print:retpid = 3116
this is child print:retpid = 3116
this is child print:retpid = 3116
this is child print:retpid = 3116
this is child print:retpid = 3116
child quit! child status = 3
cnt = 0
this is father print:retpid = 3115
cnt = 0

孤儿进程
父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程
Linux避免系统存在过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程

相关文章:

Linux--进程创建(fork)-退出--孤儿进程

进程创建&#xff1a; ①使用fork函数创建一个进程&#xff0c;创建的新进程被称为子进程。 #include <unistd.h>//头文件 pid_t fork(void); fork函数调用成功&#xff0c;返回两次&#xff1a; 返回值为0&#xff0c; 代表当前进程为子进程&#xff1b; 返回值为非负数…...

LeetCode 热题 HOT 100:链表专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 2. 两数相加19. 删除链表的倒数第 N 个结点21. 合并两个有序链表23. 合并 K 个升序链表141. 环形链表142. 环形链表 II148. 排序链表160. 相交链表206. 反转链表234. 回文链表 2. 两数相…...

Redis发布订阅

在现代的软件开发中&#xff0c;数据存储和管理是至关重要的一环。Redis&#xff0c;作为一个开源的、内存中的数据结构存储系统&#xff0c;以其出色的性能和灵活的数据结构&#xff0c;赢得了开发者们的广泛喜爱。它不仅可以用作数据库&#xff0c;还可以用作缓存和消息代理。…...

在Windows操作系统上安装PostgreSQL数据库

在Windows操作系统上安装PostgreSQL数据库 一、在Windows操作系统上安装PostgreSQL数据库 一、在Windows操作系统上安装PostgreSQL数据库 点击 PostgreSQL可跳转至PostGreSQL的官方下载地址。 &#xff08;1&#xff09; &#xff08;2&#xff09;选择安装的目录&#xff…...

【云原生】Kubeadmin部署Kubernetes集群

目录 ​编辑 一、环境准备 1.2调整内核参数 二、所有节点部署docker 三、所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1定义kubernetes源 3.2开机自启kubelet 四、部署K8S集群 4.1查看初始化需要的镜像 4.2在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录…...

Java中wait和notify详解

线程的调度是无序的&#xff0c;随机的&#xff0c;但是也是有一定的需求场景&#xff0c;希望能够有序执行&#xff0c;join算是一种控制顺序的方式&#xff08;功能有限&#xff09;——》一个线程执行完&#xff0c;才能执行另一个线程&#xff01; 本文主要讲解的&#xf…...

算法竞赛个人注意事项

浅浅记录一下自己在算法竞赛中的注意事项。 数据类 注意看数大小&#xff0c;数学库中的函数尽量加上 * 1.0&#xff0c;转成double&#xff0c;防止整型溢出。&#xff0c;int型相乘如果可能溢出&#xff0c;乘 * 1LL。 数据范围大于1e6&#xff0c;注意用快读。 浮点数输…...

ClickHouse和Doris超大数据集存储

文章目录 一. ClickHouse1. 性能2. 可靠性3. 可扩展性4. 支持SQL和复杂查询5. 适用场景 二. Doris1. 性能2. 可靠性3. 易用性4. 适用场景 三. ClickHouse和Doris的比较1. 架构2. 性能3. 可靠性4. 易用性5. 适用场景 四. 总结 ClickHouse和Doris是两种流行的超大数据集存储方案。…...

02-Flask-对象初始化参数

对象初始化参数 前言对象初始化参数import_namestatic_url_pathstatic_foldertemplate_floder 前言 本篇来学习Flask中对象初始化参数 对象初始化参数 import_name Flask程序所在的包(模块)&#xff0c;传__name__就可以 _name_ 是一个标识 Python 模块的名字的变量&#x…...

第5篇 vue的通信框架axios和ui框架-element-ui以及node.js

一 axios的使用 1.1 介绍以及作用 axios是独立于vue的一个项目&#xff0c;基于promise用于浏览器和node.js的http客户端。 在浏览器中可以帮助我们完成 ajax请求的发送在node.js中可以向远程接口发送请求 1.2 案例使用axios实现前后端数据交互 1.后端代码 2.前端代码 &…...

RabbitMQ 知识点解读

1、AMQP 协议 1.1、AMQP 生产者的流转过程 当客户端与Broker 建立连接的时候&#xff0c;会调用factory .newConnection 方法&#xff0c;这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker &#xff0c;以此通知Broker 本次交互采用的是AMQPO-9-1 协议&…...

SimVODIS++: Neural Semantic Visual Odometry in Dynamic Environments 论文阅读

论文信息 题目&#xff1a;SimVODIS: Neural Semantic Visual Odometry in Dynamic Environments 作者&#xff1a;Ue-Hwan Kim , Se-Ho Kim , and Jong-Hwan Kim , Fellow, IEEE 时间&#xff1a;2022 来源&#xff1a; IEEE ROBOTICS AND AUTOMATION LETTERS&#xff08;RAL…...

7.Xaml Image控件

1.运行图片 2.运行源码 a.xaml源码 <!--Source="/th.gif" 图像源--><!--Stretch="Fill" 填充模式--><Image x:Name...

Solidity 小白教程:11. 构造函数和修饰器

Solidity 小白教程&#xff1a;11. 构造函数和修饰器 这一讲&#xff0c;我们将用合约权限控制&#xff08;Ownable&#xff09;的例子介绍solidity语言中构造函数&#xff08;constructor&#xff09;和独有的修饰器&#xff08;modifier&#xff09;。 构造函数 构造函数&…...

静态工厂模式,抽象工厂模式,建造者模式

静态工厂模式 ublic class FruitFactory {public static Fruit getFruit(String name) {Fruit fnull;switch (name){case "APPLE":{fnew Apple();}case "BANANA":{fnew Banana();}default :{System.out.println("Unknown Fruit");}}return f;} …...

【动手学深度学习笔记】--门控循环单元GRU

文章目录 门控循环单元GRU1.门控隐状态1.1重置门和更新门1.2候选隐状态1.3隐状态 2.从零开始实现2.1读取数据2.2初始化模型参数2.3定义模型2.4训练与预测 3.简洁实现 门控循环单元GRU 学习视频&#xff1a;门控循环单元&#xff08;GRU&#xff09;【动手学深度学习v2】 官方…...

浅析linux异步io框架 io_uring

前言 Linux内核5.1支持了新的异步IO框架iouring&#xff0c;由Block IO大神也即Fio作者Jens Axboe开发&#xff0c;意在提供一套公用的网络和磁盘异步IO&#xff0c;不过io_uring目前在磁盘方面要比网络方面更加成熟。 目录 背景简介 io_uring 系统API liburing 高级特性…...

访问者模式的一个使用案例——文档格式转换

访问者模式的一个使用案例——文档格式转换 假设我们在开发一个文档编辑器&#xff0c;它支持多种不同的文档元素&#xff08;如段落、图片、表格等&#xff09;&#xff0c;现在我们需要添加一个功能——将文档导出为 HTML 或 Markdown 格式。 这就是一个典型的访问者模式的…...

【MySql】数据库的聚合查询

写在最前面的话 哈喽&#xff0c;宝子们&#xff0c;今天给大家带来的是MySql数据库的聚合查询。在前面CRUD章节我们学习了表达式查询&#xff0c;表达式查询是针对列和列之间进行运算的&#xff0c;那么如果想在行和行之间进行运算&#xff0c;那么就需要用到聚合查询。聚合查…...

Linux初探 - 概念上的理解和常见指令的使用

目录 Linux背景 Linux发展史 GNU 应用场景 发行版本 从概念上认识Linux 操作系统的概念 用户的概念 路径与目录 Linux下的文件 时间戳的概念 常规权限 特殊权限 Shell的概念 常用指令 ls tree stat clear pwd echo cd touch mkdir rmdir rm cp mv …...

苹果上架Guideline 4.3 - Design

最近上架苹果商店&#xff0c;审核提示 Guideline 4.3 - DesignWe noticed your app shares a similar binary, metadata, and/or concept as apps previously submitted by a terminated Apple Developer Program account.Submitting similar or repackaged apps is a form o…...

【数据分析入门】【淘宝电商API接入与电商数据分析】初识Web API(一)

今天开始我们将学习如何使用Web应用变成借口(API)自动请求网站到特定信息而不是整个网站&#xff0c;再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化&#xff0c;因此即便数据瞬息万变&#xff0c;它呈现到信息也都是最新的。比如&#xff0c;我们…...

蓝桥杯官网练习题(李白打酒)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 话说大诗人李白&#xff0c;一生好饮。幸好他从不开车。 一天&#xff0c;他提着酒壶&#xff0c;从家里出来&#xff0c;酒壶中有酒2斗。他边走边唱&#xff1a; …...

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化 目录 聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于自组织特征映射聚类算法(SOM)的数据聚类可视化 可直接运行 注释清晰 Matlab语言 1.多特征输入&…...

Spring AOP:面向切面编程在实际项目中的应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

python爬虫的反扒技术有哪些如何应对

Python爬虫常见的反扒技术主要有以下几种: IP封禁&#xff1a;有些网站会限制爬虫的IP访问频率&#xff0c;如果访问流量过大&#xff0c;可能会被封禁IP。可以通过使用代理IP或者轮换IP的方式规避此类反扒技术。 用户代理限制&#xff1a;有些网站会通过检测请求头中的用户代…...

网络原理,了解xml, json,protobuffer的特点

目录 外卖服务器场景带入 大佬们通用的规范格式 一、&#x1f466; 外卖服务器场景 外面服务器沟通有很多模式——展示商家列表等等&#xff0c;只是其中一个&#xff0c;因此需要一个统一的规划了——不同应用程序&#xff0c;里面的自定义格式是不一样的&#xff0c;这样的…...

工具 | XShell的学习与使用

工具 | XShell的学习与使用 时间&#xff1a;2023年9月8日09:03:29 文章目录 工具 | XShell的学习与使用1.下载2.安装 1.下载 1.官网XSHELL - NetSarang Website 2.免费版下载&#xff1a;家庭/学校免费 - NetSarang Website (xshell.com) 3.https://cdn.netsarang.net/de06d10…...

基于微服务+Java+Spring Cloud +UniApp +MySql开发的智慧工地源码(物联网、人工智能、AI识别、危大工程)

智慧工地系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术&#xff0c;通过工地中台、三维建模服务、视频AI分析服务等技术支撑&#xff0c;实现智慧工地高精度动态仿真&#xff0c;趋势分析、预测、模拟&#xff0c;建设智能化、标准化的智慧工地综合业…...

Kafka安装与使用

Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;因为其高吞吐量、分布式可扩展性等等强大功能使得在目前互联网系统中广泛使用。该篇博客入门了解一下Kafka的安装及使用。 Kafka概念 Kafk是分布式消息队列。Kafka对消息保存时根据Topic进行归类&#xff0c;发送消息…...

外包加工网上的活靠谱吗/seo免费培训教程

hcnp三本书Several friends asked me what books I have been reading. I have decided to start a new series sharing the top three books I found useful and insightful on each topic that I am interested in.有几个朋友问我在读什么书。 我决定开始一个新系列&#xff…...

千牛网站上的店铺推广怎么做/新品上市的营销方案

前几天&#xff0c;个人著作《Unity3D/2D游戏开发从0到1&#xff08;第二版&#xff09;》经过七八个月的技术准备以及近3个月的日夜编写&#xff0c;在十一长假后终于完稿。今天抽出一点时间来&#xff0c;给广大热心小伙伴们汇报一下书籍概况。 17年初&#xff0c;随着Unity5…...

菜单微网站/十大接单推广app平台

一.概述 在使用集合时&#xff0c;往往会将类的对象传入集合中&#xff0c;但当我们需要排序时&#xff0c;原有的.sort无法根据系统的规则来排序&#xff0c;所有这个时候需要我们重写排序规则第一步&#xff1a;需要将传入集合的对象类绑定接口Comparable public class Stu…...

wordpress 已安装主题/临沂seo网站管理

同步锁作用: 在我当前包含(lock.acquire() 和 lock.release()之间 )的代码没有执行完成,不进行线程切换,必须等我执行完了,下一个线程才能继续执行(为什么要用同步锁,假如我们同时在操作一个数据的时候,比如数字100,10个线程同时操作他减1的时候,每个线程减10次,我们想要拿到结…...

wordpress ishopping/中国网络营销公司排名

题目&#xff1a;歌星大奖赛内容&#xff1a;在歌星大奖赛中&#xff0c;有10个评委为参赛的选手打分&#xff0c;分数为1到100分。选 手最后得分为去掉一个最高分和一个最低分后&#xff0c;其余8个分数的平均值。问题分析和算法设计&#xff1a;问题算法比较简单&#xff0c;…...

wordpress searchform/百度竞价推广价格

1. 前奏&#xff1a;在用turtle绘制图形时&#xff0c;需要安装对应python的解释器以及IDE&#xff0c;我安装的是pycharm&#xff0c;在安装完pycharm后&#xff0c;在pycharm安装相应库的模块&#xff0c;绘图可以引入turtle模块&#xff0c;想要进行运算可以引入numpy模块。…...