当前位置:首页 » 《我的小黑屋》 » 正文

Linux笔记---进程:进程终止

11 人参与  2024年12月27日 12:00  分类 : 《我的小黑屋》  评论

点击全文阅读


1. 进程终止概念与分类

进程终止是指一个正在运行的进程结束其执行的操作。以下是一些常见的导致进程终止的情况:

一、正常终止

完成任务当进程完成了它被设计要执行的任务后,就会正常终止。收到特定信号在操作系统中,进程可能会收到来自操作系统或者其他进程发送的信号来终止自身。比如,在Linux系统中,主进程可以向子进程发送SIGTERM信号来请求子进程正常终止。子进程接收到这个信号后,可以进行一些清理工作(如关闭文件、释放内存等),然后终止进程。

二、异常终止

错误情况如果进程遇到了无法处理的错误,就可能会异常终止。例如,一个程序试图读取一个不存在的文件,并且没有合适的错误处理机制,可能会因为文件读取错误而崩溃终止。非法操作当进程执行了非法操作时也会异常终止。在内存管理方面,如果进程试图访问它没有权限访问的内存地址(如空指针引用或者越界访问数组),操作系统通常会终止这个进程以保护系统的稳定性和安全性。

 2. 退出码

进程在终止时会返回一个退出码,退出码(也称为返回码或状态码)是一个整数值,用于表示命令或程序执行后的状态。退出码通常用于指示命令是否成功执行,以及如果没有成功,原因是什么。

以下是一些常见的Linux退出码及其含义:

0:表示命令成功执行。1:表示一般错误,通常是由于命令的语法错误或参数错误导致的。2:表示命令使用不当,通常是由于命令的参数错误或使用方式错误导致的。126:表示权限被拒绝,通常是由于用户没有足够的权限来执行命令。127:表示命令未找到,通常是由于命令的路径没有被正确设置或命令不存在。128+n:表示命令被信号n终止,其中n是信号的编号。例如,130表示命令被SIGINT信号(通常是通过Ctrl+C发送)终止。143:表示命令被SIGTERM信号终止,这是默认的终止信号。255:表示退出码超过了0-255的范围,通常是由于程序内部错误或异常导致的。

 在命令行输入[echo $?]即可查看上一条指令的退出码:

注意,进程的退出码和C语言的错误码并不是一回事,二者具有一定的对应关系,但并不完全相同。 


3. 进程退出的常见方式 

3.1 从main函数返回

在main函数中通过return关键字返回的整型值就是进程的退出码。

程序正常执行结束时,我们通常会返回0,表示执行成功;程序运行到某个异常分支需要提前终止时,我们通常会返回1,表示执行失败。

3.2 调用exit()或_exit()函数退出

在C语言中,_exit函数和exit函数都用于终止程序的执行,这意味着这两个函数一旦被调用就会立即终止其调用者的执行。

3.2.1 _exit函数
#include <unistd.h>void _exit(int status);参数:status 定义了进程的终⽌状态,⽗进程通过wait来获取该值

_exit函数是一个系统调用,定义在<unistd.h>头文件中。它用于立即终止程序,不执行任何清理操作。这意味着它不会调用通过atexit注册的函数,也不会刷新输出缓冲区。

_exit函数通常用于需要快速终止程序的场景,例如在子进程中调用fork后,为了避免影响父进程的状态或输出,可以使用_exit函数立即退出。

注意,status虽然是整形(四个字节),但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值是255。

3.2.2 exit函数
#include <unistd.h>void exit(int status);

exit函数是一个标准库函数,定义在<stdlib.h>头文件中。它用于正常或异常地终止程序,并执行一些清理操作。在调用exit时,程序会执行以下操作:

调用所有已注册的atexit函数,这些函数可以用于释放资源、关闭文件等。刷新所有输出缓冲区,确保所有数据都被写入。关闭所有打开的文件描述符。

exit函数通常用于程序正常完成或者遇到错误需要提前终止时,使用exit来终止进程。

exit函数其实就是封装了作为系统调用的_exit函数,本质上就是在做完上述工作之后调用_exit函数进行退出。

3.2.3 总结

_exit函数和exit函数的主要区别在于_exit函数不会进行任何清理操作,而exit函数会执行必要的资源清理操作,确保程序能够优雅地终止。在实际编程中,应根据具体情况选择使用哪个函数。如果需要快速终止程序,不关心资源清理,可以使用_exit函数;如果需要在程序终止前进行一些清理工作,应该使用exit函数。


点击全文阅读


本文链接:http://zhangshiyu.com/post/207644.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1