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

news2024/11/25 4:51:46

文章目录

  • 进程控制
    • 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.coloradmin.cn/o/2129218.html

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

相关文章

计算机网络 数据链路层 3

以太网&#xff1a;采用CSMA/CD载波监听多路访问/冲突检测 基带总线局域网规范 以太网提供无连接&#xff0c;不可靠服务&#xff1a; 无连接&#xff1a;事先不必建立链路 不可靠&#xff1a;发送方的数据帧不进行编号&#xff0c;接收方接收信息后不向发送方发送ACK&#x…

深度神经网络DNN、RNN、RCNN及多种机器学习金融交易策略研究|附数据代码

全文链接&#xff1a;https://tecdat.cn/?p37668 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Aijun Zhang 在当今的金融领域&#xff0c;量化交易正凭借其科学性和高效性逐渐成为主流投资方式之一。随着大数据技术的蓬勃发展&#xff0c;量化交易借助先进…

en造数据结构与算法 c#语言 数组实现队列很难???看我一击破之!!!

队列的特点就是先入先出 这回不像栈那样只需要瞄准最后一个坑了 你要入队的话&#xff0c;肯定要加到最后一个坑上&#xff0c;所以要守住最后一个坑 但是&#xff0c;你只有最后一个坑的标记还不行&#xff0c;因为出队你得退出第一个坑不是么 public class SimpleQueue<…

前端开发之迭代器模式

在前端开发中&#xff0c;设计模式是提升代码可读性、可扩展性和可维护性的关键。迭代器模式&#xff08;Iterator Pattern&#xff09;是行为型设计模式中的一种&#xff0c;能够让我们顺序访问一个集合中的元素&#xff0c;而不暴露其底层的结构。在 TypeScript 这样具有类型…

空间解析几何 1 :空间中直线、圆、椭圆的方程表示

所谓空间解析几何&#xff0c;就是在三维空间中&#xff0c;求两个图形的空间关系&#xff0c;如距离&#xff0c;夹角&#xff0c;这一张给出常用的三个图形&#xff0c;直线&#xff0c;圆&#xff0c;椭圆的空间方程&#xff0c;后面会经常用到。 下一章&#xff1a;空间解析…

APP渗透思路小记

免责声明:本文仅做分享! 目录 协议 反代理 反证书 真实手机抓包: 1-查看本地pc 的 ip. 2-打开bp,配置 ip 及 端口. 3-手机设置代理: 4-手机访问 ip:port 5-安装证书 检查抓包 模拟器抓包: 开源移动端扫描工具 mobsf AppinfoScanner Frida r0capture proxifier…

新能源汽车 BMS 学习笔记篇——如何选择继电器 MOS 管作为开关

序&#xff1a;继电器和 MOSFET&#xff08;俗称 MOS 管&#xff09;都可以用作 BMS&#xff08;Battery Management System&#xff0c;电池管理系统&#xff09; 中控制电池充放电的开关&#xff0c;但它们在原理、结构和特性上存在一些区别&#xff0c;以下总结它们之间主要…

如何本地部署Ganache并使用内网穿透配置公网地址远程连接测试网络

目录 前言 1. 安装Ganache 2. 安装cpolar 3. 创建公网地址 4. 公网访问连接 5. 固定公网地址 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何本地部署Ganache并使用内网穿透配置公网地址远程连接测试网络&#xff0c;欢迎大家点赞 &a…

rocm Linpack 编译构建系统解析

0. 购买amd显卡&#xff0c;安装rocm 1, 编译 rocHPL 下载源码&#xff1a; $ git clone --recursive https://github.com/ROCm/rocHPL.git 编译&#xff1a; $ cd rocHPL/ $ ./install.sh --prefix${PWD}/../local/ 会自动 git clone blit,ucx,opempi, $ ./mpirun_rochpl …

【hot100-java】【接雨水】

R8-双指针篇 转战java后端的第一天&#xff0c;学点java语法&#xff08;手动狗头&#xff09; 这题之前写过多种解法 下面我们使用前后缀分离法解决。 class Solution {public int trap(int[] height) {int n height.length;//表示height[0]到height[i]的最大值int[] pre…

【mechine learning-七-线性回归之成本函数】

监督学习之cost function 成本函数权重、偏置如何实现拟合数据成本函数是如何寻找出来w和b&#xff0c;使成本函数值最小化&#xff1f; 在线性回归中&#xff0c;我们说到评估模型训练中好坏的一个方法&#xff0c;是用成本函数来衡量&#xff0c;下面来详细介绍一下 成本函数…

3D技术在电商独立站中的应用有哪些?

3D技术在电商独立站中的应用日益广泛&#xff0c;为电商行业带来了全新的商品展示方式和购物体验。以下是3D技术在电商独立站中的具体应用及其带来的优势&#xff1a; 一、商品3D展示 1、沉浸式体验&#xff1a; 通过3D技术&#xff0c;商品可以在独立站上以三维形式呈现&…

Word 脚注与正文之间的空行怎么删除啊?

全网都搜索不到解决方案&#xff0c;难道只有我一个人遇到这个问题了吗&#xff1f; 无语&#xff0c;。、;

9月12日的学习

练习 #include "widget.h" #include "ui_widget.h" QListWidgetItem *p; Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this))//给客户端指针实例化空间及关联父组件 {ui->setupUi(this);//初始化,ui-…

学习大数据DAY56 业务理解和第一次接入

作业1 1 了解行业名词 ERP CRM OA MES WMS RPA SAAS 了解每个系统的功能和应用 ERP 系统&#xff0c;&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划系统&#xff09;&#xff1a;ERP 系统 是一种用于管理企业各类资源的软件系统&#xff0c;包括生产管理…

2024年软件测试经典大厂面试题(全3套)【包含答案】

前言 金三银四即将过去&#xff0c;后面迎来的便是金九银十&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大家。…

STM32——玩转超声波传感器

目录 1.什么是超声波&#xff1f; 超声波的基本特点&#xff1a; 2.超声波传感器介绍&#xff1a;HC-SR04 HC-SR04 主要特点&#xff1a; HC-SR04 接线如下&#xff1a; HC-SR04 工作原理&#xff1a; 如何编写超声波测距代码&#xff1f; 编写逻辑&#xff1a; 编写思…

【2024】前端学习笔记4-图像标记

在 HTML 中&#xff0c;<img>标签用于在网页中插入图像。 基本语法&#xff1a; <img src"图像文件地址" alt"替代文本">src&#xff1a;指定图片的路径&#xff0c;可以是相对路径、绝对路径。alt&#xff1a;为图像提供代替文本&#xff0…

9.12日常记录

1.extern关键字 1&#xff09;诞生动机:在一个C语言项目中&#xff0c;需要再多个文件中使用同一全局变量或是函数&#xff0c;那么就需要在这些文件中再声明一遍 2&#xff09;用于声明在其他地方定义的一个变量或是函数&#xff0c;在当前位置只是声明&#xff0c;告诉编译器…

【办公类】幼儿健康数据模版批量更改日期(保健老师填写)

背景需求 今天下发通知 三个园区的保健老师需要填写 1.2023学年&#xff08;202406&#xff09;的六一体检数据 2.2024学年&#xff08;202409&#xff09;的新生入园体检数据 我先把上一轮填写过的数据模版下载下来&#xff08;套用模版&#xff09; 把EXCEL下载到原始文件…