进程退出方法总结与exit函数&_exit函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ArchyLi/article/details/78704402

一、简介

一般情况下进程正常退出返回0,异常退出则返回相应的退出码。而一个程序一般的退出场景有以下三个:

  • 代码运行结束,结果正确
  • 代码运行结束,结果不正确
  • 代码异常终止

常见的进程退出方式有正常结束和异常退出

正常结束:

  • 1、main函数中执行return退出
  • 2、exit
  • 3、_exit

异常结束:

  • 1、ctrl + c,信号终止
  • 2、kill信号终止——
  • 3、abort()

不管进程是上述什么方法退出的,系统最后都会执行内核中的一段相同代码,这段代码用来关闭进程所打开的文件描述符,用来释放它所占用的内存和其他相关的资源。

二、exit函数与_exit函数

(1)退出码

首先我们来介绍以下退出码,我们知道程序如果出错,都会返回一个退出码,那么这些退出码是什么呢?

exit的函数中可以让我们使用的错误码只有0~255(八个比特位,退出码存放在第八到第十六位),其他位被标记了别的信息。比如程序是否正常退出,如果是异常退出,退出码它会指明是什么原因导致异常退出的。

(2)_exit函数(系统调用到内核执行)

是系统调用,直接返回内核,没有多余的东西。

在Linux下我们man _exit会得到关于_exit函数的手册信息,里面详细的包含了它的各种信息,我们来看一下它的简单信息:

#include <unistd.h>

void _exit(int status);

#include <stdlib.h>

void _Exit(int status);
  • 其中status定义了进程的终止状态,父进程可以通过wait来获取该值,它是一个int,但是仅有8位可以被父进程所使用,所以我们执行_exit(-1)的时候,在终端执行$?它返回的值是255。

这里写图片描述

这里写图片描述

(3)exit函数

我们在Linux下使用man 3 exit即可得到exit函数的相关信息。

exit函数原型为:

#include <stdlib.h>

void exit(int status);

其中的参数status和_exit中的参数是一样的,都表明了进程的终止状态。

exit函数所做的事情:

第一件事刷新输出缓冲区,接着在做一大堆事情,最后调用_exit函数,准确来说是下面三个事情。

  • 1、执行用户通过atexit或者_exit定义的清理函数。
  • 2、关闭所有打开的流,并且将所有的缓存数据写入。
  • 3、调用_exit函数进入内核。

举例说明:

我们在Linux下分别写下如下代码

①调用_exit函数:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
    printf("haha");
    _exit(0);
}

②调用exit函数:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
    printf("haha");
    exit(0);//此处与上面的代码不一样
}

结果如下:

①调用_exit函数:

这里写图片描述

②调用exit函数:

这里写图片描述

我们看到如上代码只是调用的函数不相同,因为exit函数由于会刷新缓冲区,所以会在屏幕上显示出来,而_exit函数直接进入内核,所以不会显示出来内容。

(4)exit函数与_exit函数的区别

这里写图片描述

三、return退出

return退出是一种非常常见的退出方式,我们一般执行return n即等于执行exit(n),这时因为我们在main运行结束的时候会将main的返回值当作exit的参数。

猜你喜欢

转载自blog.csdn.net/ArchyLi/article/details/78704402
今日推荐