这篇文章中介绍了C语言中不常用的几个特征,例如函数前后我们想执行的函数设置各种花式退出程序方式等。
通常我们写C程序的时候从函数开始写,所以我们中没有人会关心这个问题。事实上,main函数不是程序的第一个执行函数,也不是程序的最后一个执行函数。在节目中。
编译并执行上面的代码,输出如下图所示。
因此,您可以看到main函数不是第一个执行的函数。那么程序中第一个执行的函数是什么?很简单。查看程序的调用堆栈就可以了。
如以上结果所示,程序的第一个执行函数是在类Unix操作系统上运行的第一个函数。
那么主函数是程序运行的最后一个函数吗?让我们看看下面的代码。
上述过程的输出如下:
由此可见,main函数也不是我们最后执行的函数!实际上,除了上述方法外,您还可以在libc中注册函数,以便在main函数之后程序结束运行之前运行。
您可以在函数注册中使用上述两个函数,在程序结束之前执行指定的函数。
我们可以详细分析上述程序的执行顺序。首先运行构造函数,运行atexit注册函数,运行on_exit注册函数,最后运行析构函数。从以上程序的输出中,我们可以看到我们注册的函数是有效的,但首先要注意注册的函数先运行的问题,不管注册的函数是使用atexit还是on_exit函数。(约翰肯尼迪,函数,函数,函数,函数,函数,函数,函数)现在我们来看下面的代码。
上述代码输出如下:
从输出结果来看,和上面提到的规则一样,首先注册注册的函数,然后执行。这一点在Linux程序员开发手册中也有提及。
但是,这里需要注意的是,由于atexit函数是标准函数,on_exit不是标准函数,因此应尽可能使用atexit函数,而不是on_exit函数。
其中,exit函数是libc提供的函数,使用该函数可以正常结束程序执行,以前注册的函数仍然可以执行。例如,在下面的代码中:
上述函数的执行结果如下:
可以看到我们的代码正常运行。
但是,_exit是系统调用。运行此方法将直接退出程序。让我们看看下面的代码。
上述代码输出如下:
可以看到,我们注册的函数和最终分析函数都没有运行,程序直接结束了。
除上述函数外,还可以通过其他方法直接退出程序。
您还可以使用内嵌程序集结束函数,通过直接调用上面的函数来结束函数。例如,在64位操作系统上,可以使用以下代码退出程序:
上面是64位操作系统关闭程序的程序集实现,64是在系统上关闭程序的系统调用号60。下面使用32位操作系统的程序集实现结束程序,在32位系统上结束程序的系统调用号为1。
这篇文章中主要介绍了C语言中与退出程序相关的几项骚操作,希望大家都有收获!(莎士比亚,C,语言,语言,语言,语言,语言)
发表评论