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

news/2025/1/16 13:31:27/

一、main函数的返回值

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

int main()
{return 0;
}

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

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

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

#include<stdio.h>int main()
{//codereturn 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()
{//codeint 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,都表示进程直接退出,不进行后续执行。

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.ppmy.cn/news/1428916.html

相关文章

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…

第十四届蓝桥杯填空题(日期统计)

问题描述 小蓝现在有一个长度为 100 的数组&#xff0c;数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 …

rCore-Tutorial-Book第二课(移除Rust std标准库依赖)

本节任务: 移除掉代码对 Rust std标准库的依赖&#xff0c;并将自己的程序改造成为能被编译到 RV64GC 裸机平台 文章目录 1. 移除 println! 宏1.1 rust代码编译到指定目标平台1.2 禁用 rust-std 标准库1.3 提供panic_handler 功能 2. 移除main 函数3. 分析被移除标准库的程序3.…

Springboot 操作Mongodb(一)

MongoDB概念 MongoDB 基本概念指的是学习 MongoDB 最先应该了解的词汇&#xff0c;比如 MongoDB 中的"数据库"、"集合"、"文档"这三个名词&#xff1a; 文档&#xff08;Document&#xff09;&#xff1a; 文档是 MongoDB 中最基本的数据单元&…

npm, reason: certificate has expired

目录 问题原因&#xff1a; 解决方法&#xff1a; 问题原因&#xff1a; CERT_HAS_EXPIRED是一个由Node.js和npm抛出的错误&#xff0c;表示你正在尝试访问的服务器的SSL证书已经过期。 解决方法&#xff1a; 步骤1 清除npm缓存 npm cache clean --force 步骤2&#xff1a…

ElasticSearch:基础操作

一、ES的概念及使用场景 ElasticSearch是一个分布式&#xff0c;高性能、高可用、可伸缩、RESTful 风格的搜索和数据分析引擎。通常作为Elastic Stack的核心来使用 我们通过将ES 和 mysql对比来更好的理解 ES&#xff0c;ES和mysql相关的基本概念的对比表格如下&#xff1a; …

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

LeetCode 面试经典150题 202.快乐数

题目&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…