[linux]进程控制——进程终止

news2025/2/5 19:58:07

一、main函数的返回值

我们在编写C语言的程序时,通常会这样写:

int main()
{
    return 0;
}

那么我们为什么要返回(return)0 呢?

其实,main函数也是一个函数,它也会被调用,所以谁调用main函数,这个返回值就会返回给谁。

我们写一个test.c来观察:

#include<stdio.h>


int main()
{
  //code


  return 3;
}

执行以上程序,我们可以看到return返回值写的是3。

我们可以通过 echo $? 查看进程退出码:

  • main函数的 返回值,就叫做进程的退出码。
  • 0 -> sucess (0表示成功)
  • !0 -> failed   (!0表示失败);此时我们就可以用不同的数字表示不同的原因                                                                                                                            

main函数的退出码是可以被父进程获取的,用来判断子进程的运行结果。 

 注:

纯数字虽然能表明出原因,但是不便于人类的阅读,所以我们将 exit code -> exit code string(可以用内置的,也可以自定义)

例:打印Linux中的错误码信息(根据运行结果可以看出有133个) 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
  //code
  int i = 0;
  for(i = 0; i < 200; i++)
  {
    printf("%d: %s\n", i, strerror(i));
  }

  return 3;
}

我们运行的mybin文件就是bash的子进程。子进程退出时,退出码会被它的父进程自动获得。

echo $? 中,?中保存的是最近一个子进程执行完毕时的退出码。 

 

例:

错误码是127 

错误码是1 

错误码与退出码

  • 错误码通常是衡量一个库函数或者是一个系统调用、一个函数的调用情况
  • 退出码通常是一个进程退出的时候,它的退出结果

相同的是,当失败的时候,用来衡量函数、进程出错时的出错详细原因。

二、进程终止

1、进程退出场景

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

异常:

进程出现异常,本质是进程收到了对应的信号,自己终止了。

例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
  char* p = NULL;
  *p = 1;

  return 0;
  
}

运行后: 

 

出现异常后,操作系统会根据发送的信号将该进程杀死。

Linux中:

那么,我们可以通过发送信号来终止一个进程 :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

int main()
{
  while(1)
  {
    printf("进程: %d\n", getpid());
    sleep(1);
  }
  
  
  return 0;
}

程序运行:

此时,我们可以通过kill -11 27747 杀死该进程 (以 -11 为例,也可以是其它信号):

 

 因此,一个进程是否出异常,我们只需看有没有收到信号即可。

 2、exit(进程的退出码)

任意地点调用exit,都表示进程直接退出,不进行后续执行。

exit: 

1. 执行用户通过 atexit或on_exit定义的清理函数。
2. 关闭所有打开的流,所有的缓存数据均被写入
3. 调用_exit

例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

int main()
{
  printf("test\n");

  exit(13);
  
  return 0;
}

3、_exit和exit

  • exit是库函数,_exit是系统调用
  • exit终止进程的时候,会自动刷新缓冲区;_exit终止进程的时候,不会自动刷新缓冲区

注:缓冲区不在操作系统内部。

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

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

相关文章

go限流、计数器固定窗口算法/计数器滑动窗口算法

go限流、计数器固定窗口算法/计数器滑动窗口算法 一、问题 问题1&#xff1a;后端接口只能支撑每10秒1w个请求&#xff0c;要怎么来保护它呢&#xff1f; 问题2&#xff1a;发短信的接口&#xff0c;不超过100次/时&#xff0c;1000次/24小时&#xff0c;要怎么实现&#xff…

RN向上向下滑动组件封装(带有渐变色)

这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样 代码如下 import React, {useEffect, useRef, useState} from react; impo…

这样的看板你喜欢吗?

看板这个功能很多项目管理软件都有这个功能。基本上都是分类列表&#xff0c;大致分为 已完成、开发中、规划中 分类也是可以自己添加的 每个分类就是一个列表。 但是我个人觉得相对于文字来说人对图像更敏感&#xff0c;项目管理中一个重要的因数时间在上面看板并没与体现出来…

HBase2.x学习笔记

文章目录 一、HBase 简介1、HBase 定义1.1 概述1.2 HBase 与 Hadoop 的关系1.3 RDBMS 与 HBase 的对比1.4 HBase 特征简要 2、HBase 数据模型2.1 HBase 逻辑结构2.2 HBase 物理存储结构2.3 HBase的表数据模型 3、HBase 基本架构3.1 Master3.2 Region Server3.3 Zookeeper3.4 HD…

yolov8目标检测 部署瑞芯微rk3588记录

1. 前置条件 本地电脑系统&#xff0c;ubuntu20.04 训练代码&#xff1a; 训练代码下载的ultralytics官方代码 SHA&#xff1a;6a2fddfb46aea45dd26cb060157d22cf14cd8c64 训练代码仅做数据修改&#xff0c;类别修改&#xff0c;代码结构未做任何修改 需要准备的代码&#…

Spring GA、PRE、SNAPSHOT 版本含义及区别

GA:General Availability: 正式发布的版本&#xff0c;推荐使用&#xff08;主要是稳定&#xff09;&#xff0c;与maven的releases类似&#xff1b; PRE: 预览版,内部测试版。主要是给开发人员和测试人员测试和找BUG用的&#xff0c;不建议使用&#xff1b; SNAPSHOT: 快照…

智能装箱机:打造高效物流新时代的革命性工具

在快节奏的现代生活中&#xff0c;物流行业的效率与智能化水平直接关系到消费者的购物体验和企业的市场竞争力。装箱机作为物流包装中重要的一个环节&#xff0c;其智能化升级已成为行业发展的必然趋势。星派将与大家探讨装箱机为什么说是智能化装箱解决方案? 一、装箱机的智能…

C# 超高速高性能写日志

1、需求 需求很简单,就是在C#开发中高速写日志。比如在高并发,高流量的地方需要写日志。我们知道程序在操作磁盘时是比较耗时的,所以我们把日志写到磁盘上会有一定的时间耗在上面,这些并不是我们想看到的。 2、解决方案 2.1、简单原理说明 使用列队先缓存到内存,然后我…

WARNING: No swap limit support——查看docker状态时提示警告

环境&#xff1a;Ubuntu 20.04 1、警告详情 执行命令 service docker status如下图 2、解决办法 2.1 修改文件 执行命令 vim /etc/default/grub在GRUB_CMDLINE_LINUX中追加cgroup_enablememory swapaccount1&#xff0c;如下&#xff1a; # If you change this file…

2024年工程师职称水平能力测试考试难吗?

大家现在都知道&#xff0c;现在湖北中级和高级职称评审&#xff0c;都必须要先报名一个水平能力测试考试&#xff0c;水测考过了之后才能参加评审&#xff0c;那么很多人都不知道水测到底难不难&#xff1f;能不能考过&#xff1f;水测主要是考什么呢&#xff1f; 职称水平能力…

IP地址是随着网络变化的吗?

IP地址&#xff0c;即互联网协议地址&#xff0c;是分配给每个联网设备或网络接口的数字标签。它在网络通信中起着至关重要的作用&#xff0c;是设备之间互相识别和通信的基础。然而&#xff0c;关于IP地址是否随着网络变化&#xff0c;这是一个值得深入探讨的问题&#xff0c;…

高效办公-电脑驱动管理

一、计算机硬件与驱动程序的关系 之前讲电脑的组成时候说了一嘴电脑由硬件和软件组成。软件运行在操作系统上&#xff0c;硬件则需要驱动来匹配运行。在计算机系统中&#xff0c;硬件设备的操作和控制需要通过驱动程序来实现&#xff0c;驱动程序在操作系统和硬件设备之间起到桥…

ABAP CONVERSION_EXIT_ATINN_INPUT

CONVERSION_EXIT_ATINN_INPUT 因为在直接使用ZMM015这个特性值会报错 点击执行之后&#xff1a; 然而这个是N类型的&#xff0c;我们的筛选条件是C类型的&#xff0c;数据类型是不匹配的。 这个是经过转换的

安卓官方例程

https://learn.microsoft.com/zh-cn/shows/connecton-demand/202?sourcerecommendations https://learn.microsoft.com/zh-cn/visualstudio/cross-platform/cross-platform-mobile-development-in-visual-studio?viewvs-2022 https://learn.microsoft.com/zh-cn/shows/xamari…

temux安装debian自用记录

http://ip:9001/ user/123 http://ip:5705/index admin/drpy 一、安装Ubuntu1804 1&#xff0e;首先安装termux.app 2&#xff0e;启动该app&#xff0c;输入命令 curl -Lo l l.tmoe.me; sh l 3&#xff0e;运行过程中连续选“Y”&…

记录一次内存溢出

1、查看catalina相关日志&#xff0c;确定关键字相关行号 文件&#xff1a;catalina.out命令1&#xff1a;cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上&#xff0c;每一个行号其实都对应到具体时间点。可以发现&#xff0c;这个范围相符合&#xff1…

如何用ServBay快速构建下一代GraphQL应用

在本指南中&#xff0c;我们将深入探讨如何利用ServBay一站式环境和Docker&#xff0c;构建可扩展的GraphQL微服务。我们将从微服务架构和GraphQL的基础知识入手&#xff0c;逐步深入到如何利用现代工具和技术构建、容器化并部署我们的微服务。 理解微服务架构 微服务架构是一…

【算法】删除链表中重复元素

本题来源---《删除链表中重复元素》。 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入…

java-生产者消费者

目录 1.生产者消费者1.1生产者和消费者模式概述【应用】1.2生产者和消费者案例【应用】1.3生产者和消费者案例优化【应用】1.4阻塞队列基本使用【理解】1.5阻塞队列实现等待唤醒机制【理解】 1.生产者消费者 1.1生产者和消费者模式概述【应用】 概述 生产者消费者模式是一个十…

惯用Python的5个技巧(循环)

在这篇文章中&#xff0c;你将看到5种方法可以使你的python循环更习惯&#xff0c;运行得更快&#xff0c;内存效率更高。 在我看来&#xff0c;Python是计算机科学中最简单、最通用的语言之一。如果你正确地编写python代码&#xff0c;很难区分python代码和伪代码。但有时&…