网站建设推广咨询平台,在线制作logo设计,男女明星直接做的视频网站,重庆玖玺国际做网站#x1f57a;作者#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 #x1f618;欢迎关注#xff1a;#x1f44d;点赞#x1f64c;收藏✍️留言 #x1f3c7;码字不易#xff0c;你的#x1f44d;点赞#x1f64c;收藏❤️关注对我真的… 作者 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 欢迎关注点赞收藏✍️留言 码字不易你的点赞收藏❤️关注对我真的很重要有问题可在评论区提出感谢阅读 前言
前面我们讲述了使用fork函数进行进程的创建既然有创建就有终止那么本篇将向大家讲述进程终止的相关知识~
进程终止与操作系统
进程终止时操作系统做了什么呢当然是要释放进程申请的相关内核数据结构和对应的数据和代码。本质就是释放系统资源。
进程退出场景
进程退出有三种场景如下
代码运行完毕结果正确代码运行完毕结果不正确代码异常终止
这里我们要展开讲一下。在我们使用c语言进行编程的时候我们会注意到main函数的返回值总是return 0为什么总是0呢因为他是进程的退出码。那他一定得是0吗并不是的。他返回这个数字的意义在于返回给你上一级进程用来评判该进程执行结果用的。如果非零值就说明是程序是有错误的非零值有无数个不同的非零值就可以标识不同的错误原因所以它的作用就是在我们的程序运行结束之后结果不正确可以方便我们定位错误的原因细节。
举个例子
测试代码
#include stdio.h
#include unistd.hint main()
{int a[3]{0};printf(%d\n,a[1])//注意看这里少了个 ;return 0;
}这里还要介绍一个指令它可以查看上一个进程运行错误的原因。
echo $? 返回2
是什么意思呢别急
我们先来查看一下这些“非零值”都代表着什么
#include stdio.h
#include string.h
#include unistd.h
int main()
{for(int number 0; number 150; number){printf(%d: %s\n, number, strerror(number));//将数字代表的错误原因展示出来} return 0;
}查看结果 进程常见退出方法
正常终止可以通过 echo $? 查看进程退出码 1. 从main返回2. 调用exit3. _exit 异常退出 ctrl c信号终止 _exit函数
#include unistd.h
void _exit(int status);
参数status 定义了进程的终止状态父进程通过wait来获取该值 说明虽然status是int但是仅有低8位可以被父进程所用。所以_exit(-1)时在终端执行$?发现返回值是255。 exit函数
#include unistd.h
void exit(int status); exit最后也会调用_exit, 但在调用_exit之前还做了其他工作 1. 执行用户通过 atexit或on_exit定义的清理函数。 2. 关闭所有打开的流所有的缓存数据均被写入 3. 调用_exit 测试一下
exit函数
#includestdio.h
#include stdlib.h
int main()
{printf(hello);exit(0);
}
运行 _exit函数
#includestdio.h
#include stdlib.h
int main()
{printf(hello);_exit(0);
} 运行 因为我们设置的字符串后面没有“\n”也就是说它会待在缓冲区中然后我们会发现_exit函数会直接结束而exit函数则是先把缓存区内的数据冲刷出来才结束其实exit是库函数而_exit是系统接口exit函数最后会调用操作系统的_exit函数。
这里给大家留下一个问题printf——\n数据保存在缓冲区中的请问缓冲区在哪里谁维护但是我们知道它一定不在操作系统内部如果是操作系统维护的缓冲区_exit就一定能够刷出来今天我只能告诉你是C语言标准库给我们维护的。懂得的小伙伴可以在评论区打出一起交流~
return退出
return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。
后记
本篇我们主要讲述了进程的退出场景进程的终止正常情况下它有三种退出的方式异常情况可以使用ctrlc的方式终止~