进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)

  • 正常终止
  • 调用方式
    • 无return 无返回值
    • 有return 无返回值
    • 有return 无返回值
  • 在程序的任意位置调用exit函数
  • exit函数原型
  • 在程序的任意位置调用_exit函数
    • _exit函数原型
  • return、exit和_exit的返回值问题
    • 裸机时
    • 有OS时

正常终止

进程主动调用终止函数/返回关键字所实现的结束,就是正常终止。

main调用return关键字结束
程序任何位置调用exit函数结束
程序任何位置调用_exit函数结束

main函数调用return关键字,实现正常终止,return关键字的作用是返回上一级函数,如果main函数的子函数调用return的话,返回的上一级是main函数。如果main函数调用return的话,main函数所返回的上一级是启动代码。main函数被启动代码调用。

调用方式

比如:return 返回值;

这个返回值也被称为进程的终止状态。
只有main函数返回return的时候进程才能终止,其他函数调用会返回到上一级函数,只有main函数返回return返回结束。

返回值的意义
返回值标记的了进程的终止状态,比如一般情况下。

return 0:正常结束
return -1:代表了某种操作失败
return -2:代表了另一种的操作失败

当然什么值代表了什么操作失败,其实可以由程序员来自己规定。

如果return时我不写返回值编译能过,但是有警告,因为与main函数的返回值要求不相符合。明确的写出return,但是又不写明返回值的话,返回值不定,所谓不定的意思是,main函数最后一次调用的子函数所返回的返回值是多少,main函数就会使用这个返回值来返回。

无return 无返回值

我们先来看直接不写return 和返回值的情况

#include 
int fun()
{
        return 0;
}
int main()
{       
        printf("hello world\n");
}  

我们在运行之后通过
echo $? 来查看函数返回值。
进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第1张图片

我们可以看到函数默认返回值为0
隐式调用:就是不明写出return,当main函数中的最后一句代码执行完毕后,会默认的调用return返回,不过隐式return时,默认返回0。

有return 无返回值

我们接下来演示有return但是没有具体返回值的情况:

#include 
  

int fun()
{
        return 10;
}
int main()
{
        printf("hello world\n");
        return ;
}

运行结果为:
进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第2张图片

我们可以看到在编译的时候会有警告,但是能够执行并且返回值为12那么为什么是12呢?我们前面说过,如果没有具体的返回值,main函数将返回最后一次调用函数的函数值进行返回。printf函数的返回值是打印内容的长度,所以通过命令查询返回值为12。

有return 无返回值

接下来我们演示不调用任何函数,有return 但是没有返回值的情况。

#include 
  

int fun()
{
        return 10;
}
int main()
{
        //printf("hello world\n");
        return ;
}

执行结果为:
进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第3张图片

如果main函数没有调用任何子函数,而且return又没有返回任何值的话,我的机器上返回值为65.

是谁来接收这个返回值的,这个返回值可以用做什么,我们后面进行说明。

当然我们也可以调用子函数,如果明确有return没有返回值的话,会直接调用最后一次调用函数的返回值,我们在前面已经说明,现在我们换一个例子更加明显的说明:

#include 
  

int fun()
{
        return 10;
}
int main()
{
        //printf("hello world\n");
        fun();
        return ;
}

运行结果为:
进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第4张图片

我们可以看到main函数返回的就是调用fun函数的值。

在程序的任意位置调用exit函数

在程序中任何位置调用exit都有效,也就说不管是在main函数中调用,还是在main的子函数中调用,甚至是在子函数的子函数中调用都是有效的。
其实,main函数调用return返回到启动代码后,启动代码也是调用exit函数来实现正常终止的。

exit函数原型

#include 
void exit(int status);

看到stdlib.h这个头文件,我们就知道exit函数是一个c库函数。
这个参数就是返回值(进程终止状态)。

main函数调用return将返回值返回给启动代码后,启动代码又会调用exit(返回值),将返回值返回。

代码演示:

#include 
#include 


int fun()
{
        return 10;
}
int main()
{
        //printf("hello world\n");
        fun();
        exit(5);
}

执行结果为:

进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第5张图片

我们可以看到函数返回值为 5

我们在子函数中调用exit函数;

#include 
#include 


int fun()
{
        exit(12);
}
int main()
{
        //printf("hello world\n");
        fun();
}

运行结果为:
进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第6张图片

我们可以看到通过子函数直接退出返回值为12

一般我们在报错处理的时候使用exit函数,在main函数里面,我们经常还是使用return进行返回

在程序的任意位置调用_exit函数

_exit是一个系统函数(系统API),而exit是c库函数,exit就是调用_exit来实现的。既然exit也是靠调用_exit来实现的,那么我们也就可以直接调用_exit了。不过更多时候,我们调用的还是exit函数,因为exit对_exit封装后,exit额外还做了好些事情,至于做了些什么事情,这个留到后面再来解释。

_exit函数原型

#include 
void _exit(int status);

用法与exit一样。

return、exit和_exit的返回值问题

前面说过return、exit和_exit的返回值,也被称为进程终止状态。

裸机时

只能调用return返回,因为没有OS时,不支持exit和_exit函数。

裸机时,main的return到启动代码后,返回动作到启动代码就截止了。
在裸机情况下,一般来说main函数所return的返回值,对启动代码来说没有太大意义所以在裸机下,main函数return返回什么值都无所谓。

有OS时

return、exit、_exit,使用哪种来返回都行。
但是推荐大家使用return、exit,因为_exit是Linux OS的系统调用,在windows就不支持了。

return
进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第7张图片

exit
在这里插入图片描述

_exit

进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze)_第8张图片

有OS时,不管是采用哪种方式实现正常终止,返回值都会被返回给OS。一般情况下没有意义,但是在有些特殊情况下是有意义的,只不过这种情况很少见,有关这个问题我们留到进程控制时再来详细说明。

你可能感兴趣的:(进程(程序)的正常终止方式,调用方式,在程序的任意位置调用exit或_exit函数函数,return、exit和_exit的返回值问题(进程环境)【linux】(ze))