Q:以下代码中的atexit()方法并没有被调用,知道为什么吗?

#include <stdio.h>
#include <stdlib.h>
void func(void)
{
    printf("\n Clean up function called \n");
}
int main(void)
{
     //int atexit(void (*func)(void));
     //注册终止函数(即main执行结束后调用的函数)
     /*注意:按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用。atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 登记时候的顺序相反。同一个函数如若登记多次,则也会被调用多次。*/
    atexit(func);
    _exit(0);
}

A:这是因为使用了 _exit() 方法。此方法并没有调用清除数据相关的方法,比如 atexit()等。exit和_exit都是用来正常终止一个进程的,主要区别是_exit会立刻进入内核,而exit先执行一些清除工作(包括执行各种终止处理程序,关闭所有标准I/O等,一旦关闭了IO,例如printf等函数就不会输出任何东西了),然后才进入内核。这两个函数会对父子进程有一定的影响,当用vfork创建子进程时,子进程会先在父进程的地址空间运行(这跟fork不一样),如果子进程调用了exit就会把父进程的IO给关掉。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注