3

如果我隐式调用 exit() :

int main(){
  return 0; /*exit(0) is being called */
}

或明确:

int main(){
  exit(0);
  return 0; /* this is never reached */
}

终点是相同的:正在调用exit() 。现在根据一些消息来源,exit()将使进程在将控制权交还给操作系统之前进行一些清理。

我知道最终内核(操作系统)将释放所有资源。那么在将控制权交给内核之前清理进程有什么特别之处呢?这个清理究竟是什么?为什么是必要的?进程如何知道要清理什么?

4

3 回答 3

4

和以往一样,这个问题可以参考 C 规范 (N1256) 来解决。7.20.4.3 给出以下定义exit()


3.首先,函数注册的所有atexit函数都被调用,按照注册的相反顺序调用,除了在注册时已经调用的任何先前注册的函数之后调用函数。如果在调用任何此类函数期间,对该函数的调用longjmp将终止对已注册函数的调用,则行为未定义。

4.接下来,刷新所有打开的带有未写入缓冲数据的流,关闭所有打开的流,并tmpfile删除该函数创建的所有文件。

5.最后,控制权返回宿主环境。如果状态的值为零或EXIT_SUCCESS,返回状态成功终止的实现定义形式。如果 status 的值是EXIT_FAILURE,实现定义的状态形式,则返回不成功终止。否则返回的状态是实现定义的。


或者用英语:

首先调用所有注册atexit的函数。接下来刷新所有未写入的缓冲数据。接下来关闭打开的流。最后,将退出状态和控制权返回给操作系统。

于 2012-01-07T13:40:01.150 回答
4

C 运行时库支持在进程退出时运行用户代码,使用atexit()函数设置。这不是底层操作系统知道的事情,因此exit()例如需要实现这一点的代码。

于 2012-01-07T12:55:24.587 回答
0

这是特定于操作系统的,但通常在现代平台上,打开的文件将被关闭并stdio刷新它们的进程内 ( ) 缓冲区。其他清理将在操作系统端处理。

于 2012-01-07T12:54:01.467 回答