在Linux系统下,可以通过一下方式结束进程
1、显示调用exit或_exit系统调用
2、在main函数中执行return语句
3、隐含地离开main函数
进程在正常退出前都需要执行注册的退出处理函数,刷新缓冲刘等操作,然后释放进程用户空间所有资源,而进程控制块PCB并不在这是释放
一、exit与return的区别
1、return表示退出当前函数,exit表示退出当前进程,所以当前函数为main函数时两者等价
2、return仅从当前函数中退出,并不退出进程,exit则是退出进程然后刷新关闭IO流
下面程序中main函数while(1)死循环调用子函数,当子函数用exit退出时表示退出当前进程,所以仅会调用一次,不会造成死循环
#include#include#includevoid output()
{
printf("hello linux\n");
exit(EXIT_SUCCESS) ;
}
int main()
{
while(1)
{
output();
}
}
二、调用_exit直接退出,并不会调用任何注册函数做善后处理
下面一个例子调用_exit退出不会刷新缓冲流
#include#include#includeint main()
{
printf("output\n]");
printf("hello linux");//没有\n
//_exit(0); 会输出hello linux“”
exit(0);//不会输出“hello linux”
}
三、注册退出函数
函数atexit()和on_exit()用来执行exit前的操作,即在执行exit时实际上调用了atexit或on_exit,其实就是回调了它们
atexit和on_exit的区别是on_exit注册的函数带参数
extern int atexit(void (*_func)(void))
extern int on_exit(void (*_func)(int _status,void* _arg),void* arg)
on_exit
第1个参数为退出的状态即exit的退出参数
第二个参数为用户输出的信息一个void 指针可以指向一段代码位置或输出信息
如果执行成功返回0否则-1,错误原因存在errno中
#include#include#includevoid output(int status,void* arg)
{
printf("exit: %d\n",status);
printf("arg: %s",(char*)arg);
}
int main()
{
char *str="hello linux\n";
on_exit(output,(void*)str);
exit(100);
}
输出:exit: 100
arg: hello linux