Linux:进程的创建进程的终止
进程的创建
fork
fork是c语言中的一个函数,用于创建新的子进程,它存放在<unistd.h>的头文件中
当我们运行程序时,如果使用了fork函数那么就会为这个进程创建一个它的子进程,这个子进程会继承父进程的所有数据和代码,但其实子进程是和父进程共用一套数据和代码。还有一个重点是:
内存指针:子进程会继承父进程的内存指针,内存指针用于指向程序执行到了哪里。
我们来测试一下fork是否真的会创建一个新的进程。我们来看以下代码
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{printf("hello world!!!\n");fork();printf("ganchuhao!!!!!\n");printf("gansimiao!!!!!\n");sleep(1);
}
运行结果
我们可以看到,在fork之前的程序只运行了一次,但是在fork之后的语句运行了两次,
从这张图中我们就可以看出fork函数会创建一个子进程,而子进程会继承父进程的代码和数据,并且在父进程运行下一行的位置开始运行
fork会返回两个值,子进程返回0,父进程返回子进程PID
其实这也就解释了为什么我们会看到fork有两个返回值,我们先来看一段代码
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{pid_t id=fork();if(id==0){printf("我是父进程\n");}else{printf("我是子进程\n");}}
我们会发现为什么呢?为什么id这个变量能同时满足两个条件语句,我们会以为id有两个值 ,其实真正的原因是在运行fork时父进程会创建一个子进程,而子进程会继承父进程的数据和代码,所以子进程也有了自己的id而父进程有一个id,那么父进程的id就是非零的而子进程的id是零,所以不是fork有两个返回值,而是fork返回了两个分别对应两个id,然后这两个id进入了两个条件语句
写时拷贝
当父进程创建子进程的时候,系统为了节省内存开支,就让子进程和父进程共用一份数据和一份代码,但是当子进程需要对数据修改时,系统便会重新为要修改的数据开创一份空间,将数据内容拷贝下来,然后修改。
我们先来判断父子进程是否共用一套数据和代码
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{printf("hello,world!!!\n");pid_t id=fork();printf("Ganchuaho!!!!!\n");printf("Gansimiao!!!!!\n");printf("Ganchujian!!!!\n");
}
运行结果
这里 hello,world!!!运行了一次,而其它的语句运行了两次,说明子进程和父进程是共用同一套代码和数据的
这里不管是父进程还是子进程页表都是只读的,但是当子进程需要修改数据时,那么页表就可以写入,并且操作系统开辟一块空间与页表项映射
进程终止
退出码
退出码:在main程序正常退出时会返回一个值,这个值称为退出码
当我们在写程序时,我们的main函数总是返回0,表示程序正常退出
echo $?
这个指令可以查看上一个程序的退出码是什么
我们来用代码测试一下
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{return 123;
}
运行结果
这里main函数返回123,所以输出123
strerror
strerror可以用来查看系统有多少错误信息,这些错误信息都对应一个错误码,它包含在<string.h>头文件中,我们来用代码测试一下
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{for(int i=0;i<20;i++){printf("[%d]:%s\n",i,strerror(i));}}
输出结果
这里我们就输出前20个错误码对应的错误信息就可以了
我们会发现这里有些错误信息是我们经常遇到的
比如
[2]:No such file or directory
这里我们可以测试一下
当前工作目录下没有text.txt文件,但是我们仍然让ls去读取这个文件,那么系统就会报出这个错误,说明当前工作目录没有text.txt文件
我们再来用echo $?检测一下错误信息
错误信息是2,这也就更加说明了我们提出的结论
errno
errno是用于存储上一次函数错误的错误返回码,其存储在<errno.h>头文件中
我们用代码测试一下
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{fopen("text.txt","r");printf("[%d]:%s\n",errno,strerror(errno));
}
运行结果如下
fopen无法打开当前工作路径下没有的文件,所以errno会记录fopen的错误码
异常
当程序发生错误时,程序仍然可以运行,但是当程序发生异常时,程序便会退出,在上文中fopen无法打开文件,便发生错误,但是程序仍然还是可以运行printf还是可以打印结果
我们来测试一下如果程序发生异常还会不会运行
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{printf("hello,world\n");double a=5/0;printf("hello school\n");
}
这段代码发生了除零错误,让我们来运行一下看看结果时什么
这里代码执行到hello,world就结束了,说明程序遇到异常时,便会停止执行程序
kill -l
此命令可以查看所有的异常信号
其实不只程序自己会发生异常信号,我们也可以想程序传递一个异常信号,这种方式会导致进程停止
kill -X PID
其中X是我们需要传递那种异常信号
我们来写个死循环程序来检测一下
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
int main()
{while(1)printf("hello,world\n");
}
运行结果
输入指令
我们再看另外一个Xshell的结果
当我们输入上面那个指令时便输出了这个结果,我们先要进程爆出上面异常,我们就输入哪个指令对应的数字就可以了
kill 不仅可以杀死进程,还能给进程抛异常
exit
exit可以直接结束进程,无论进程执行到了哪里,只要执行到了exit
我们来用一段代码来测试一下
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
void func()
{exit(5);
}
int main()
{func();return 0;
}
检查错误码
程序运行完后检查错误码和exit的值是一样的
注意:无论exit在进程的哪一个部分时,只要执行到了exit就会退出进程
exit有两个版本,还有一个时_exit,这个_exit是系统提供给我们的,就算是exit也是由_exit放在exit进行实现的,_exit存在于<unistd.h>
这个是系统的_exit,我们man一下是可以查出来的
我们可以看到这个函数是存在于<stdlib.h>中的
这两个都能直接结束进程
但是_exit不会刷新缓冲区,exit会刷新缓冲区
exit的底层是由_exit实现的
相关文章:
Linux:进程的创建进程的终止
进程的创建 fork fork是c语言中的一个函数,用于创建新的子进程,它存放在<unistd.h>的头文件中 当我们运行程序时,如果使用了fork函数那么就会为这个进程创建一个它的子进程,这个子进程会继承父进程的所有数据和代码&…...
[C#]反射的实战应用,实际数据模拟
long? value null; // 看它是不是 HEX_STRING var dtAttr prop.GetCustomAttribute<DataTypeAttribute>(); if (dtAttr ! null && dtAttr.DataType DataType.HEX_STRING) {// 去掉可能的 "0x" 前缀string txt attribute.Value.StartsWith("0…...
机器人灵巧手有刷与无刷空心杯电机解析
一、电机结构分析 (一)有刷空心杯电机结构 有刷空心杯电机主要由上壳、碳刷、连接板、换向器线圈、外壳、轴承、永磁体、下壳及轴承密封圈组成。碳刷与换向器直接接触,负责传导电流,使线圈在永磁体产生的磁场中受力转动。这种机械换向方式虽直接,但碳刷磨损会影响电机寿命…...
JetBrains GoLang IDE无限重置试用期,适用最新2025版
注意本文仅用于学习使用!!! 本文在重置2024.3.5版本亲测有效,环境为window(mac下应该也一样奏效) 之前eval-reset插件只能在比较低的版本才能起作用。 总结起来就一句:卸载重装,额外要删掉旧安装文件和注册…...
【网络应用程序设计】实验四:物联网监控系统
个人博客:https://alive0103.github.io/ 代码在GitHub:https://github.com/Alive0103/XDU-CS-lab 能点个Star就更好了,欢迎来逛逛哇~❣ 主播写的刚够满足基本功能,多有不足,仅供参考,还请提PR指正ÿ…...
第六章:安全最佳实践
Chapter 6: 安全最佳实践 🌟 从上一章到本章 在第五章:框架/工具抽象中,我们学会了如何用框架快速搭建MCP服务器。现在想象这样一个场景:你的文件服务器已经开发完成,但突然发现恶意用户能通过路径遍历攻击访问系统文…...
最高支持高速L3商用,华为发布ADS 4智驾系统
作者 |张马也 编辑 |德新 4月22日,华为在上海召开乾崑智能技术大会。 会上,华为正式推出乾崑智驾ADS 4、鸿蒙座舱HarmonySpace 5、乾崑车控XMC数字底盘引擎等一系列智能汽车解决方案。 其中最为重磅的是,华为正式发布高速L3商用解决方案&a…...
[创业之路-382]:企业法务 - 企业如何通过技术专利与技术秘密保护自己
企业通过技术专利与技术秘密保护自身创新成果是构建核心竞争力的关键策略。以下从技术专利和技术秘密两大维度,系统阐述其保护路径及实施要点: 一、技术专利保护策略 1. 专利布局规划 核心专利:针对核心技术进行专利申请,构建基…...
多路转接epoll原理详解
目录 从epoll接口入手 创建epoll模型 用户告诉内核关心的事件 内核告诉用户就绪的事件 epoll的原理 整体思路 如何判断事件是否就绪 事件就绪后如何实现将节点插入就绪队列 从epoll接口入手 本篇文章从epoll的三个接口入手介绍epoll的具体工作原理 创建epoll模型 #in…...
基于 MCP用 Python 搭建 “大模型网关”在 MCP 服务器端聚合多个大模型的 API,将其统一为 MCP 协议接口
下面给出基于 MCP(Model-Connection-Protocol)设计思想,用 Python 搭建 “大模型网关” 的典型开发流程。整体思路是:在 MCP 服务器端聚合多个大模型的 API,将其统一为 MCP 协议接口;在客户端按需调用这些统一后的接口。总结如下: 概要: 需求与架构定位:Clarify 要接入…...
Linux的时间函数
ucos中有systick这个系统时间滴答,那linux中有没有这种系统时间滴答呢?有,jiffies,但是用户空间不可以使用。那么在linux中除了使用timer定时器进行定时,可以通过时间滴答的方式来进行粗略的计时吗?下面介绍…...
JCE cannot authenticate the provider BC
本地使用了加密类、并且运行正常、 用hutool做RSA加密时候出现这个问题的! import cn.hutool.core.codec.Base64; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SmUtil; import…...
4.1 融合架构设计:LLM与Agent的协同工作模型
大型语言模型(Large Language Models, LLMs)与智能代理(Agent)的融合架构已成为人工智能领域推动企业智能化的核心技术。这种协同工作模型利用LLM的语言理解、推理和生成能力,为Agent提供强大的知识支持,而…...
【Spec2MP:项目管理之项目风险管理】
在半导体行业竞争白热化的今天,一颗芯片从设计到量产的旅程犹如跨越重重险峰。据行业数据显示,30%的芯片项目因未及时识别风险导致延期交付,而55%的成本超支源于前期风险评估不足。这背后折射出一个核心命题:如何在复杂的技术攻关…...
【Axure教程】表格嵌套卡片
今天教大家制作表格嵌套卡片的原型模版,可以点击加号或减号展开或收起对应部门下的员工卡片信息。这个表格是用中继器制作的,所以使用也很方便,在中继器表格里维护数据,即可自动生成交互效果,具体效果可以打开下方原型…...
无人机动力核心测评:CKESC STONE 180A-M 电调
一、核心技术优势:全场景适配的智能控制方案 作为南昌长空科技的工业级产品,南昌长空的STONE 180A-M 电调以高可靠启动算法为核心,支持 6-14S 锂电输入,具备逆风启动稳定性与剧变油门抗丢相能力,实测油门响应时间 300…...
【回眸】Aurix TC397 IST 以太网 UDP 相关开发
前言 关于移植IST功能至 Infineon TC397上主要涉及到UDP发送报文及接收。IST是安全诊断相关的工作 Nvidia IST介绍 Orin系列芯片会提供一种机制来检测由系统内测(IST)所产生的永久的故障,IST 应该在 Orin-x 功能安全系统中使用期间被启动。…...
C语言别踩白块附源码
复制即可使用 #define _CRT_SECURE_NO_WARNINGS//一定要放在第一行 #include<stdio.h>//引用输入输出头文件,每一次都需要引用这个文件 #include<math.h> #include<string.h> #include<ctype.h> #include<stdlib.h> #include<io…...
centos7里memcached 的安装使用
memcahced 的概述 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。 Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应…...
深入理解指针(3)
1.指针的使⽤和传址调⽤ 1.strlen的模拟实现 库函数strlen的功能是求字符串⻓度,统计的是字符串中\0 之前的字符的个数。函数原型如下: 参数str接收⼀个字符串的起始地址,然后开始统计字符串中 \0 之前的字符个数,最终返回⻓度。…...
第十届电气、电子和计算机工程研究国际学术研讨会(ISAEECE 2025)
重要信息 官网:www.isaeece.com(点击了解参会投稿等) 时间:2025年6月20-22日 地点:中国 ▪ 西安 征稿主题 电气、电子和计算机工程(Electrical, Electronics and Computer Engineering, EECE)…...
RabbitMQ 中的队列声明
目录 一、为什么要声明队列?二、声明队列的基本语法参数说明 三、声明队列的示例代码示例 1:声明一个普通的队列示例 2:声明一个持久化队列示例 3:声明一个带 TTL 的队列 四、注意事项五、总结 在 RabbitMQ 中,队列是消…...
unity Animation学习,精准控制模型动画播放
unity 控制模型动画播放,Animation学习。 此脚本挂载在带有动画的模型上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AnimationCtrl : MonoBehaviour {void Start(){PlayAnimation();//开始的时候调用播放动…...
大模型面经 | 春招、秋招算法面试常考八股文附答案(六)
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
【深度学习】#9 现代循环神经网络
主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 概述 门控循环单元和长短期记忆网络利用门控机制实现对序列输入的选择性记忆。深度循环神经网络堆叠多个循环神经网络层以实现更强的表达能力和特征提取能力。…...
《CBOW 词向量转化实战:让自然语言处理 “读懂” 文字背后的含义》
文章目录 前言一、自然语言模型统计语言模型存在的问题总结:这两个问题的本质,第一个是"容量问题":模型记忆力有限;第二个是"理解力问题":模型缺乏抽象能力。 二、词向量转换1.onehot编码编码过程…...
网络变更:APIC 节点替换
Draft 一、同版本硬件更换 1. 查看 APIC 状态 System > Controllers > (any APIC) > Cluster APIC1> acidiag avread // APIC 参数 2. 下线故障设备 Actions > Decommission 3. 物理移除故障设备,连接目标 APIC 4. 根据第一步中的配置参数配置目…...
Java在excel中导出动态曲线图DEMO
1、环境 JDK8 POI 5.2.3 Springboot2.7 2、DEMO pom <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>commons…...
Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)
以下是一个使用Python爬取图片并存储到MongoDB的示例实现,包含详细步骤说明: import requests from bs4 import BeautifulSoup from pymongo import MongoClient from datetime import datetime import os import re# 配置信息 mongoIP mongodb://root…...
Qt —— 在Linux下试用QWebEngingView出现的Js错误问题解决(附上四种解决办法)
错误提示:js: A parser-blocking, cross site (i.e. different eTLD+1) script, https:xxxx, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If bloc…...
240424 leetcode exercises II
240424 leetcode exercises II jarringslee 文章目录 240424 leetcode exercises II[148. 排序链表](https://leetcode.cn/problems/sort-list/)🔁分治 & 归并排序法1. 找中点并断开2. 合并两个有序链表3. 主函数:递归拆分与合并 [24. 两两交换链表…...
STM32实现2小时延时的最佳方法探讨
在嵌入式系统开发中,特别是使用STM32这类微控制器时,实现精确的长时间延时是一项常见但具有挑战性的任务。延时的方法选择不仅影响系统的性能和功耗,还关系到系统的稳定性和可靠性。本文将探讨在STM32上实现2小时延时的几种方法,并…...
G3学习笔记
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 准备工作 import torch import numpy as np import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torc…...
初识Redis · 主从复制(上)
目录 前言: 主从模式 模拟主从模式 连接信息 slaveof命令 nagle算法 Nagle算法的工作原理: 具体实现: 优点: 缺点: 使用场景: 拓扑结构 前言: 主从复制这里算得上是一个大头了&…...
欧拉计划 Project Euler55(利克瑞尔数)题解
欧拉计划 Project Euler 55 题解 题干思路code 题干 思路 直接暴力找即可,若使用其他语言要注意溢出的问题,这里我使用的手写大数加法 code // 249 #include <bits/stdc.h>using namespace std;using ll long long;string add(const string&am…...
关于nginx,负载均衡是什么?它能给我们的业务带来什么?怎么去配置它?
User 关于nginx,我还想知道,负载均衡是什么?它能为我的业务带来什么?怎么去配置它? Assistant 负载均衡是 Nginx 另一个非常强大的功能,也是构建高可用、高性能应用的关键技术之一。我们来详细了解一下。 …...
【项目管理】进度网络图 笔记
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应&…...
【C++QT】Buttons 按钮控件详解
文章目录 一、QPushButton 基础按钮控件二、QToolButton 轻量工具按钮控件三、QRadioButton 互斥选择控件四、QCheckBox 状态选择控件五、QCommandLinkButton 引导式按钮控件六、QDialogButtonBox 对话框按钮布局控件七、实践与选型建议八、总结如果这篇文章对你有所帮助&#…...
威雅利电子|业界领先的高隔离度用于5G基站的吸收式SPDT开关“NT1819“
业界领先的高隔离度 用于5G基站的吸收式SPDT开关"NT1819" 为了实现智能社会,已经启动了5G服务。这样,高速、低延迟、大容量的数据通信成为可能,也给我们的生活和工业发展带来了巨大的变化。 在5G基站有很多天线,每个天…...
【DNS】BIND 9的配置
该文档围绕BIND 9的配置与区域文件展开,介绍了BIND 9配置文件及区域文件的相关知识,以及权威名称服务器、解析器的相关内容,还阐述了负载均衡和区域文件的详细知识,具体如下: 基础配置文件: named.conf&am…...
高可靠性厚铜板制造的关键设备与工艺投入
随着科技的不断发展,电子设备越来越普及,对电路板的需求也越来越大。厚铜板电路板作为一种高性能、高可靠性的电路板,受到了广泛的关注和应用。那么,作为一家厚铜板电路板供应商,如何投入线路板生产呢?本文…...
m365是什么,和o365的区别
M365(Microsoft 365)是微软推出的基于云的办公套件,包含多种生产力工具,旨在帮助个人和企业提高工作效率。它包括经典的办公软件,如Word、Excel、PowerPoint、Outlook等,还提供协作和云存储服务,…...
【Pandas】pandas DataFrame dot
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
技术服务业-首套运营商网络路由5G SA测试专网在深光搭建完成并对外提供服务
深光为了更好的服务蜂窝无线技术及运营商测试认证相关业务,搭建了技术服务业少有的5G测试专网,可独立灵活配置、完整端到端5G(含RedCap、LAN)的网络架构。 通过走真正运营商网络路由的方式,使终端设备的测试和运营商网…...
GrassRouter 小草MULE多5G多链路聚合通信路由设备在应急场景的聚合效率测试报告及解决方案
在应急通信场景中,快速、稳定、高效的通信链路是保障救援工作顺利开展的关键。MULE(Multi-Link Unified Link Enhancement)多链路聚合路由通信设备作为一种新型的通信技术解决方案,通过聚合多条通信链路(如4G/5G、卫星…...
解释器模式:自定义语言解析与执行的设计模式
解释器模式:自定义语言解析与执行的设计模式 一、模式核心:定义语言文法并实现解释器处理句子 在软件开发中,当需要处理特定领域的语言(如数学表达式、正则表达式、自定义配置语言)时,可以通过解释器模式…...
第十二章 Python语言-大数据分析PySpark(终)
目录 一. PySpark前言介绍 二.基础准备 三.数据输入 四.数据计算 1.数据计算-map方法 2.数据计算-flatMap算子 3.数据计算-reduceByKey方法 4.数据计算-filter方法 5.数据计算-distinct方法 6.数据计算-sortBy方法 五.数据输出 1.输出Python对象 (1&am…...
Oracle数据库巡检脚本
1.查询实例信息 SELECT INST_ID, INSTANCE_NAME, TO_CHAR(STARTUP_TIME, YYYY-MM-DD HH24:MI:SS) AS STARTUP_TIME FROM GV$INSTANCE ORDER BY INST_ID; 2.查看是否归档 archive log list 3.查看数据库参数 SELECT NAME , TYPE , VALUE FROM V$PARAMETER ORDER BY NAME; 4.…...
示例:Spring JDBC编程式事务
以下是一个完整的 Spring JDBC 编程式事务示例,包含批量插入、事务管理、XML 配置和单元测试: 1. 项目依赖(pom.xml) <dependencies><!-- Spring JDBC --><dependency><groupId>org.springframework<…...
Happens-Before 原则
Happens-Before 规则 Happens-Before是JMM的核心概念之一,是一种可见性模型,保障多线程环境下前一个操作的结果相对于后续操作是可见的。 程序顺序性,同一线程中前面代码的操作happens-before后续的任意操作。volatile变量规则,…...