Linux | 进程控制(上):进程终止(strerror函数、errno宏、_exit() 与 exit())

文章目录

  • 进程控制
    • 1、进程终止
      • 1.1进程常见退出方法
        • 退出码
        • 1.1.1 strerror函数 & errno宏
        • 1.1.1 _exit函数
          • _exit和exit的区别
          • 结合现象分析:

进程控制

1、进程终止

1.1进程常见退出方法

进程退出场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

正常终止(可以通过echo $?查看进程退出码)

1.从main返回

2.调用exit

3._exit

异常退出:

  • ctrl + c,信号终止
退出码

当异常退出时,可以用return的不同的返回数字,表征不同的出错原因,即退出码

在正常写一个C/C++程序的时候,经常使用return 0;,但是在多进程的环境中,return的值就有讲究了。

1.1.1 strerror函数 & errno宏

strerror

头文件#include<string.h>

返回值:指向描述error errnum的错误字符串的指针,简单来说可以将退出码和对应的错误对应上。

举例:

#include<string.h>
int main()
{for(int i=0;i<10;i++){printf("%d: %s\n",strerror(i));}return 0;
}

效果如下,后面输出的就是退出码对应的错误描述:

errno

头文件#include<errno.h>

简单的说,errno会返回最后的一次错误码,使用errno可以获得退出码,通过返回退出码,在多进程中也可以让父进程知道子进程的状况。

注意:但是当进程异常退出的时候,本质可能就是代码没有跑完,那么进程的退出码就无意义了,所以应该要先看进程退出的时候,如果要关心进程的推出情况,要先关心退出时后有没有出异常,如果没有异常,再看结果是否正确,然后关心退出码。


  • 父进程关心子进程的退出,只需要确定:
    1. 父进程是否收到来自子进程的信号,若没有,说明没有异常,代码正常跑完
    2. 查看退出结果:0表示成功,非0表示错误,对应各自的原因

举例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>int main()
{int ret = 0;char *p = (char*)malloc(1000*1000*1000*4);if(p==NULL){printf("malloc error, %d: %s\n".errno,strerror(errno));ret = errno;}   else{printf("malloc success\n");}   return ret;
}
1.1.1 _exit函数

头文件#include<unistd.h>

函数格式void _exit(int status);

_exit函数最后也会调用exit,但是在调用exit之前,还会做以下工作:

1、执行用户通过atexiton_exit定义的清理函数

2、关闭所有打开的流,所有的缓存数据均被写入

3、调用_exit

例1:

int main()
{printf("hello linux\n");exit(12);
}

或者:

int main()
{printf("hello linux\n");return 12;
}

编译执行完后再使用echo $?查询退出码,效果均如下:

区别在于:exit在任意地方被调用,都表示调用进程直接退出,如果调用的是return,只表示当前函数返回,原进程继续运行,如果调用一个含exit或者return的函数,就可以明显观察到。

_exit和exit的区别
结合现象分析:
int main()
{printf("hello world");sleep(1);//使用sleep能够观察到一些现象,下文会提及exit(11);
}

运行完毕后再调用echo $?查看退出码,效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是将exit改为_exit后:

int main()
{printf("hello world");sleep(1);exit(11);
}

运行完毕后再调用echo $?查看退出码,效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

原因

当代码中输出的内容以\n结尾时,当代码运行到printf这条语句时,程序会直接输出内容,但是如果没有以\n结尾,那么就会先将内容存到缓冲区中,当程序结束前会冲刷缓冲,关闭流,然后就有打印输出的效果,也正因此会发现运行的时候是先等待了一秒钟,输出句子后程序马上结束,而不是先输出句子,等待一秒钟再结束程序。


结合下图

  • 调用exit()后会先执行用户定义的清理函数,再冲刷缓冲,关闭流等,因此会有打印字符串的效果,最后再调用_exit系统调用
  • _exit()是一个系统调用接口,调用_exit()后,其会在操作系统内部直接终止进程,对应缓冲区的数据不做刷新。

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

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

相关文章

Redis 集群高可用详解及配置

关型数据库 关系型数据库&#xff1a; 是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据 主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库 关型数据库的优缺点 特点&#xff1a; 1、数据关系模型基于关系…

学生请假管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 学生请假管理系统拥有两种角色 管理员&#xff1a;班级管理、课程管理、学生管理、审核请假信息、导出请假单 学生&#xff1a;填写请假单、查看请假审核情况 1.1 背景描述 学生请假管…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

C++速通LeetCode第6题-环形链表

快慢指针真的很好用&#xff01; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:bool hasCycle(ListNode *head) {//快慢指针ListNode* fast…

高效Flutter应用开发:GetX状态管理实战技巧

探索GetX状态管理的使用 前言 在之前的文章中&#xff0c;我们详细介绍了 Flutter 应用中的状态管理&#xff0c;setState、Provider库以及Bloc的使用。 本篇我们继续介绍另一个实现状态管理的方式&#xff1a;GetX。 一、GetX状态管理 基础介绍 GetX 是一个在 Flutter 中…

Ubuntu 20.04/22.04无法连接网络(网络图标丢失、找不到网卡)的解决方案

问题复述&#xff1a; Ubuntu 20.04无法连接到网络&#xff0c;网络连接图标丢失&#xff0c;网络设置中无网络设置选项。 解决方案 对于Ubuntu 20.04而言&#xff1a;逐条执行 sudo service network-manager stopsudo rm /var/lib/NetworkManager/NetworkManager.statesudo…

C# 使用Socket通信,新建WinForm服务端、客户端程序

一、新建WinForm Socket服务端程序 注&#xff1a;rtbReceviceMsg为RichTextBox控件 服务端程序、界面 服务端代码 public partial class Form1 : Form {public Form1(){InitializeComponent();}public virtual void TriggerOnUpdateUI(string message){if (this.InvokeRequir…

【SQL笔试题】SN_1 连续登陆系列问题

简介 连续登陆天数场景描述是对一个特定情境或活动连续发生的天数进行详细的阐述。这种描述通常用于展示某个事件或活动的持续时间&#xff0c;以及它对参与者或环境产生的影响。 常见的应用场景&#xff1a; 用户留存分析&#xff1a;通过跟踪用户的连续登录天数&#xff0…

240908-Linux通过ln设置软链接关联大模型文件

在Linux中&#xff0c;您可以使用ln命令来创建软链接&#xff08;符号链接&#xff09;。软链接是一种特殊类型的文件&#xff0c;它指向另一个文件或目录。以下是如何设置软链接的步骤&#xff1a; 创建软链接 基本语法&#xff1a; ln -s [目标文件或目录] [软链接的名称]示…

轮询解决方案

概述 轮询的使用场景&#xff1a; 股票 K 线图聊天重要通知&#xff0c;实时预警 这些场景都是都要实时性的。 http 是请求响应模式&#xff0c;一定需要先请求&#xff0c;后响应。 解决方案&#xff1a; 短轮询&#xff1a;interval 定时发送请求。问题&#xff1a;大量…

如何使用Python创建目录或文件路径列表

在 Python 中&#xff0c;创建目录或生成文件路径列表通常涉及使用 os、os.path 或 pathlib 模块。下面是一些常见的任务和方法&#xff0c;用于在 Python 中创建目录或获取文件路径列表。 问题背景 在初始阶段的 Python 学习过程中&#xff0c;可能遇到这样的问题&#xff1a…

基于Boost库的搜索引擎开发实践

目录 1.项目相关背景2.宏观原理3.相关技术栈和环境4.正排、倒排索引原理5.去标签和数据清洗模块parser5.1.认识标签5.2.准备数据源5.3.编写数据清洗代码parser5.3.1.编写读取文件Readfile5.3.2.编写分析文件Anafile5.3.2.编写保存清洗后数据SaveHtml5.3.2.测试parser 6.编写索引…

无人机动力系统设计之电调芯片参数选型

无人机动力系统设计之电调芯片参数选型 1. 源由2. 关键因素2.1 电压范围2.2 电流处理能力2.3 控制方式2.4 PWM输出与分辨率2.5 通讯接口2.6 保护功能2.7 支持霍尔传感器与无传感器模式2.8 集成度与外围器件2.9 效率与散热2.10 市场供应与成本 3. 因素阐述3.1 PWM工作频率3.1.1 …

Seata

TC - 事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM - 事务管理器 定义全局事务的范围&#xff1a;开启全局事务、提交或回滚全局事务。 RM - 资源管理器 管理分支事务处理的资源&#xff0c;向 TC 注册分支事务&#xff0c;报告分支事务的…

Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用

前言 之前使用Chainlit集成Langchain并使用通义千问大语言模型的API接口&#xff0c;实现一个基于文档文档的网页对话应用。 可以点击我的上一篇文章《Chainlit集成Langchain并使用通义千问和智谱AI实现AI知识库检索网页对话应用》 查看。 本次将Langchain框架更改为LlamaInde…

Hive任务优化参数整理

Hive本身是个基于hdfs的结构化数据管理工具&#xff0c;虽然在后面的发展中允许底层接入其他的数据源&#xff0c;比如第三方数据服务这种基础架构&#xff0c;但是它从立意上来说&#xff0c;它不适合用来做高性能查询引擎&#xff0c;反而在传统离线数据仓库中它有着自身的优…

使用 Elastic 和 LM Studio 的 Herding Llama 3.1

作者&#xff1a;来自 Elastic Charles Davison, Julian Khalifa 最新的 LM Studio 0.3 更新使 Elastic 的安全 AI Assistant 能够更轻松、更快速地与 LM Studio 托管模型一起运行。在这篇博客中&#xff0c;Elastic 和 LM Studio 团队将向你展示如何在几分钟内开始使用。如果你…

校园生活点餐外卖配送到宿舍小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 随着移动互联网的普及和校园生活的多元化&#xff0c;学生们对于线上点餐、外卖配送等服务的依赖度越来越高。然而&#xff0c;传统的校园餐饮服务模式往往存在效率低下、覆盖范围有限、信息不透明等问题&#xff0c;难以满足学生多样化的需求。因此&#xff0c;开发…

30万月变现3-6万,你也可以

30万月变现3-6万&#xff0c;你也可以 我相信&#xff0c;这些年我的IP还是吸引了不少的中产阶级关注我&#xff0c;什么叫中产阶级&#xff0c;就是兜里还是能随便掏出大几十大几百万的现金的&#xff0c;这群人&#xff0c;有着自己稳定的职业和收入来源&#xff0c;生活水平…

实例讲解电动汽车换挡控制策略及Simulink模型搭建方法

轻型电动汽车一般采用直驱的方式作为驱动方式&#xff0c;即不经过变速箱进行速比的调节&#xff0c;电机输出轴直接经过主减速器将动力传输至车轮。换挡器的换挡方式一般为VCU接收档位器的换挡请求后&#xff0c;根据整车当前状态判断换挡状态&#xff0c;最后输出当前档位状态…