【Linux学习笔记33】进程的状态与创建退出(fork()与exit(0)/_exit)

Linux进程管理:fork与写时拷贝机制详解 进程管理是操作系统核心功能之一,Linux通过fork()系统调用实现进程创建,其底层采用写时拷贝(Copy-On-Write)技术优化性能。该技术通过延迟内存复制到实际写入时刻,大幅减少fork操作开销。在进程终止方面,Linux提供多种退出方式,涉及资源回收和状态传递机制。理解这些原理对开发高性能服务器程序至关重要,特别是在需要频繁创建子进程的Web服务器、数据库连接池等场景。通过合理使用COW技术,可以显著提升系统吞吐量,同时避免僵尸进程等常见问题。 阅读详情

进程的状态

在这里插入图片描述

  1. 父进程通过fork()创建子进程(子进程进入就绪态,等待内核调用至CPU运行)
  2. 子进程进入CPU,状态改为执行态
  3. 若运行时间耗尽,或者被高优先级抢占,则返回为就绪态等待
  4. 若资源不足,则进入睡眠挂起态等待资源。睡眠挂机分为:浅度睡眠:可被中断,可以接受信号马上响应。深度睡眠:不可被中断,接受信号仍然响应不了。(一般出现在等待资源为硬件资源,如按键唤醒)
  5. 睡眠挂起状态获得资源马上进入就绪态等待。
  6. 若执行态收到暂停信号:SIGSTOP/SIGTSTP,则进入暂停态。直到收到恢复信号(SIGCONT)才返回就绪态等待。
  7. 若执行态中程序正常退出,或者遇到最后线程,或者被信号杀死,则进入僵尸态等待被处理。
  8. 父进程会通过调用wait/waitpid函数将僵尸态进程进行回收资源,获得子进程退出状态,同步父子进程等操作,使僵尸态进程变为死亡态。

进程的创建与退出

进程创建fork()
head功能
函数接口pid_t fork(void)
所需头文件#include<unistd.h>
返回值-1:执行失败
返回值0:执行成功,且返回到子进程
返回值1:执行成功,且返回到父进程中。返回值为其子进程的PID
注意该函数成功执行时,将会使得原来的进程一分为二,分别称之为父进程和子进程,fork会分别返回到父子进程当中,然后它们并发独立运行

代码示例:
在这里插入图片描述
代码运行结果在这里插入图片描述
通过上述程序不仅介绍了如何使用fork()创建子进程
同时也说明了子进程的修改与父进程互不相关,两者是并发独立运行的。

进程的退出exit/_exit

在这里插入图片描述
通过上图可以了解两者的不同功能
首先介绍一下什么是退出处理函数:
在这里插入图片描述
在这里插入图片描述
通过运行结果可以知道,只有当程序正常退出的时候,才会去调用的退出处理函数,那么这个退出处理函数的方式是以栈的方式去注册的。

如果使用_exit()退出:则不会对这些函数进行处理。

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析 本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。 阅读详情

相关推荐

springcloud+nacos+gateway+oauth2小聚会

在微服务工程中,Nacos作为目前主流的注册中心和配置中心,Spring Cloud Gateway作为目前主流的网关,下面引入spring security+oauth2+jwt作为认证和授权中心,进行简单的聊聊。

ldcaws的专栏 2646

进程控制浅谈 fork、exit、wait、exec

进程创建 fork() 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 使用fork()需要包含 #include<unistd.h> fork(void) 的返回值类型为 pid_t 给父进程返回创建成功的子进程的PID(进程号),给子进程返回 0。 代码举例: 结果: 由输出结果我们看到,在代码 if 和 else if 中的语句都被执行了,这貌似和我们之前的认知不同,两个相反的...

wwyyds的博客 3510

MaxKey+JeecgBoot单点登录实战:手把手教你从零配置到账户同步

本文提供MaxKey与JeecgBoot单点登录(SSO)的实战整合指南。详细讲解从MaxKey应用注册、JeecgBoot前后端改造,到最终实现账户同步的完整步骤,重点解决Shiro配置、令牌交换等关键问题,帮助企业构建统一、可扩展的身份管理体系。

weixin_29258297的博客 542

Linux进程控制——进程创建(fork)、进程终止(exit\_exit)、进程等待(wait\waitpid)和进程替换(exec函数)

一、进程创建 1.1 fork函数初识 对于fork函数的参数和返回值可以阅读本篇博客 Linux进程编程实践1——进程的基本概念、fork创建进程 这里直接上图了解fork的头文件和参数 Q1:为什么父进程返回子进程id,而子进程返回0? 现实生活中,任何孩子都知道自己的父亲(排除特殊情况),而父亲却可能有多个孩子,因此就需要一个代号来标识每一个孩子,简单来说就是父亲:孩子=1:n 因此,对于操作系统来说,父进程有多个子进程,需要返回子进程的pid来调度每个子进程,而任何子进程都知道自己的父进程,因此返

1604

Vivado Combinatorial Loop Alert问题 [DRC LUTLP-1]

Vvado综合和布局布线都通过了但是无法生成bit文件,提示Combinatorial Loop Alert,错误如下图。在RTL图中可以看到LUT的输出连接到了输入上,这个就是。在代码中我并未找到导致这种情况发生的地方,如果遇到类似的问题先检查自己的代码是不是存在组合逻辑连接出现了问题,如果没问题再考虑通过设置去解决问题。

伊丽莎白的学习之路 6032

STK与Matlab连接报错?手把手教你解决mexConnect函数执行问题(附完整避坑指南)

本文针对STK与Matlab连接时常见的“mexConnect函数执行”报错,提供了完整的诊断与解决方案。文章深入剖析了错误根源在于路径冲突或文件损坏,并手把手指导用户通过定位STK连接器文件、正确配置Matlab路径(包括使用addpath命令)以及执行初始化测试三步走策略,彻底解决问题。同时附上版本兼容性检查、安装避坑指南及构建稳健工作流的建议,帮助用户建立可靠的STK-Matlab联合仿真环境。

yolo5detector的博客 473

Linux进程控制(一)fork和exit

1.概述           进程控制包括创建新进程,进程终止,等待,执行程序几个操作。 2.新建进程:fork系列函数 2.1 fork       #include &lt;unistd.h&gt;       pid_t fork(void);        调用一次fork,会返回2次,子进程返回0,父进程返回子进程的pid;出错返回-1。       子进程获得父进程数据空...

wlli1985的博客 2496

Nginx&&Keepalived(一)Keepalived介绍

一、背景: 案例1:如现有服务my-service-demo,希望实现高可用和负载均衡: 首先,my-service-demo服务部署在两台机器上,通过nginx去代理这两个节点,负载均衡就实现了。如果只有一个nginx,这台nginx机器一旦宕机,访问nginx会报错。这时候在另外一台机器nginx2上也安装nginx,并配置同样的代理,可以解决上述问题,但是暴露给用户的只有一个域名(或ip),不可能给用户提供两个域名,域名1(nginx机器1)访问不了了再让用户访问域名2(nginx机器2),这

w_t_y_y的博客 2885

Linux进程的fork、exit、wait等函数;区分父子进程;GDB调试多进程

fork、exit和_exit、wait和waitpid函数;区分父子进程的方式;父子进程堆区内存开辟释放问题;GDB调试多进程。

坚持学习 1611

ESP8266入门(一)固件烧录及常见问题分析

为了实现对数据的远程收集和分析,偶然间发现了esp8266这个模块,对此进行了深入的学习,可是在学习之初遇到了大量的问题,这个系列文章就为大家讲讲我遇到的坑以及解决办法,还有esp8266如何连上oneNet云平台的方法。因为我用的是esp8266nodemcu,可以直接连接usb进行烧录,如果用模块的话接线就比较麻烦,可以去搜搜看.

Jerryxuzherui的博客 8955

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 529

Linux进程创建fork、进程退出exit()、进程等待waitpid()

虽然通过标题,我们就轻易的知道了这三个函数的作用,可是,你真的了解这几个函数码?

qq_61932634的博客 1197

【华为OD机试】真题A卷-Linux发行版的数量(Python)

【华为OD机试】真题A卷-Linux发行版的数量(Python):Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。给你一个nxn的矩阵isConnected,其中isConnected[i][i]=1表示第i个发行版和第j个发行版直接

u014481728的博客 944

Linux:创建进程,终止进程

Linux:创建进程,终止进程

2401_88433210的博客 1182

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

进程等待给僵尸进程收尸,轮询等待,阻塞和非阻塞等待,7个exec替换函数,shell派生子进程的程序替换,shell的内建命令,cwd和exe路径……

The porters of knowledge 2561

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Linux】进程控制

解析 Linux 中的进程创建、进程终止、进程等待和进程程序替换相关话题,再次理解环境变量!

YoungMLet的博客 1760

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux:进程控制(创建/终止/等待/获取退出信息/多进程)

本文介绍了Linux系统中进程创建、终止和等待的相关机制。在进程创建方面,重点讲解了fork函数的工作原理,包括父子进程的独立性、写时拷贝技术及其应用场景。进程终止部分阐述了正常和异常退出的不同情况,以及exit()和_exit()函数的区别。进程等待章节详细说明了wait和waitpid系统调用的使用方法,包括如何通过status参数获取子进程退出状态信息。文章通过代码示例展示了这些系统调用的实际应用,并解释了相关概念如退出码、信号号等。这些机制共同构成了Linux进程管理的基础,确保了系统的稳定运行和资

分享C,C++,数据结构,Linux,算法内容 1007

从零开始学Linux进程控制:fork、wait、exec 详解

return、exit、_exit之间的联系。

ABWSO的博客 1236

Linux进程创建,进程终止,进程等待,进程程序替换,简易shell代码

Linux进程创建,进程终止,进程等待,进程程序替换,简易shell代码

weixin_73142957的博客 1180

Linux 进程控制

通过 exec* 函数,把磁盘中的其它程序(代码+数据)加载到内存中,替换当前进程的代码和数据,让页表重新构建映射关系,这期间不会创建新的进程。

puppy_1mo的博客 1368

linux之进程如何退出

正常退出 1.main函数调用return 2.进程调用exit(),属于标准c库 3.进程调用_exit()或者_Exit(),属于系统调用 补充:1:进程最后一个线程返回 2:最后一个线程可以调用pthread_exit 异常退出 1.调用abort 2.当进程收到某些信号,如ctrl+c 3.最后一个线程对取消(cancellation)请求做出响应 僵尸进程 僵尸进程:是因为子进程退出状态不被收集,导致僵死僵死进程 1 #include <stdio.h>

m0_67033140的博客 3260

Linux:进程(三)

进程终止,进程等待,进程替换

m0_68142120的博客 1250

Linux---进程控制(1)(创建,终止,退出,等待)

关于写时拷贝在上一篇博客里已经提到过了,只不过现在想补充一个点,fork之后,父子进程的代码和数据是共享的,一般来说,代码是只读的,数据是读写的,但是fork之后会特殊一点,代码依旧是只读的,数据也会变成只读,在父子进程没有任何一方要修改数据时,父子进程的代码和数据是映射到同一个物理内存空间的。

2501_94636284的博客 285

【Linux系统】详解,进程控制

一个父进程希望复制自己,使父子进程同时执行不同的代码段。e.g. 父进程等待客户端响应,生成子进程处理请求。进程终止的本质就是进程结束,系统释放资源:释放进程申请的相关数据结构和对应的代码与数据。一个进程想要执行多个不同的代码。fork函数是Linux系统提供的接口,其功能就是创建子进程。退出码是进程的性质之一,所以退出码会保存到进程的PCB中。3.代码异常终止(进程接收到型号终止,退出码无意义)代码语言:javascript。代码语言:javascript。代码语言:javascript。

2509_93923260的博客 349

【Liunx专栏_4】Liunx进程控制

在本章节主要讲述进程的创建、进程等待、进程终止以及进程替换的相关知识……

2301_78704584的博客 1004

进程控制——进程的创建、终止、等待、替换

Linux进程控制,主要包含进程的创建、终止、等待、替换

m0_74303551的博客 976
上一篇: 【Linux学习笔记32】进程与线程的基本理解
下一篇: 【Linux学习笔记34】进程操作核心API(exec组函数,wait/waitpid)
RayCongLiang
博客等级 码龄9年 51粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值