Linux进程终止
2021/7/31 7:06:27
本文主要是介绍Linux进程终止,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.进程退出场景:
- 代码运行完毕,结果正确
- 代码运行完毕,结果不正确
- 代码异常终止
2.进程常见退出方法:
- main函数return
- ctrl+c:退出前台进程
- exit和_exit函数
接下来就来了解exit和_exit函数的区别
exit函数:该函数是库函数,谁调用谁退出
void exit (int ststus)
status:进程退出的状态码
_exit函数:该函数是系统调用函数,也是谁调用谁退出
void _exit (int status)
status:进程退出的状态码
exit函数的内部封装了_exit函数
exit函数在退出进程的时候比_exit函数多做两件事;
刷新缓冲区
执行用户自定义的清理函数
区别1 冲刷缓冲区
缓冲区:其实就是内存中临时存储数据的一块空间,这样做的目的是为了减少与物理内存交互的次数
int main( ) { printf("hello");//加\n直接输出,不加要等一秒才输出 sleep(1); return 0; }
现象:一秒后hello才显示到屏幕上
实质:打印hello并不是直接在屏幕上输出,是先缓存在内存中,然后再在缓冲区中将其内容冲刷出来;
加不加 \n 有一个本质区别:它是否刷新了缓冲区,
也就是说将hello放在某个内存中,不加 \n 就没有主动刷新这个缓冲区到屏幕上去,在当前程序结束后才放入缓冲区刷新至屏幕
再次深入理解缓冲区:
库函数的代码实现是在C运行时库中,系统调用函数的代码实现是在内核当中,上面所说的缓冲区是在C运行时库中;
例如:printf是一个库函数,调用printf后就把hello放入C运行时库定义的一个缓冲区(缓冲区是一块内存)中;
加\n就主动刷新这块内存,将内存中内容输出到屏幕上,不加\n就要依赖别的刷新手段(程序结束刷新)
exit函数是靠 _exit函数实现的
#include<stdio.h> #include<stdlib.h> int main( ) { printf("hello"); exit(1); //执行完该语句代码就会退出 printf("haaaaaa\n"); return 0; }
现象:
代码运行到
exit(1)
后结束,屏幕只显示hello,如果换成 _exit,则不会打印hello;
原因:系统调用函数比C库函数更底层
exit是一个库函数(终止一个进程),缓冲区也在C运行时库中;所以该库函数在实现时会刷新缓冲区,所以可以看到hello;
_exit函数是系统调用函数,并不知道C运行时库,直接结束进程并且也不刷新缓冲区,不打印hello
结论:exit会比_exit多做一件事,那就是刷新缓冲区
区别2 执行用户自定义的清理函数
先了解另一个知识点:
回调函数:
int atexit (void (*function) (void))
- 参数:是函数指针类型,接收一个函数的地址
- 返回值:为void,参数也是void
atexit函数是清理函数,本质是回调函数
#include<unistd.h> void mycallback (void)//该函数称为回调函数 { printf ("1\n"); } int main ( ) { atexit (mycallback); //调用atexit的过程就是注册回调函数 printf ("2\n"); return 0; }
现象:
先打印2,再打印1
原因:
atexit函数是注册 了一个函数mycallback(mycallback函数就是回调函数);
当main函数结束后才会调用刚注册的mycallback函数
回调函数功能:
先注册回调函数:调用atexit函数
再调用回调函数:调用mycallback函数
3.刷新缓存区的办法:
- main函数return返回之后
- fflush:强制刷新
- \n
- exit函数
这篇关于Linux进程终止的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南