验证atexit

来源:互联网 发布:java se6 for mac下载 编辑:程序博客网 时间:2024/06/04 18:07

一.源代码:

<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:vim 7_3.c
#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);


int main()
{
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit2) != 0)
                err_sys("register exit2 error!");
        printf("main done");
        return 0;
}


static void my_exit1(void)
{
        printf("call exit1\n");
}


static void my_exit2(void)
{
        printf("call exit2\n");
}

二运行结果:.

<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:./ateixt
main donecall exit2
call exit1
call exit1


三把return换成exit后运行结果:

<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:vim 7_3.c
#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);


int main()
{
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit2) != 0)
                err_sys("register exit2 error!");
        printf("main done");
        exit(0);
}


static void my_exit1(void)
{
        printf("call exit1\n");
}


static void my_exit2(void)
{
        printf("call exit2\n");
}
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"7_3.c" 25L, 428C written
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:gcc -Wall -ggdb3 -o ateixt 7_3.c
In file included from apue.h:132,
                 from 7_3.c:1:
error.c: In function `err_doit':
error.c:121: warning: implicit declaration of function `vsnprintf'
error.c:123: warning: implicit declaration of function `snprintf'
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:./ateixt
main donecall exit2
call exit1
call exit1

4 换成_exit后:

<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:vim 7_3.c
#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);


int main()
{
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit2) != 0)
                err_sys("register exit2 error!");
        printf("main done");
        _exit(0);
}


static void my_exit1(void)
{
        printf("call exit1\n");
}


static void my_exit2(void)
{
        printf("call exit2\n");
}
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"7_3.c" 25L, 429C written
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:gcc -Wall -ggdb3 -o ateixt 7_3.c
In file included from apue.h:132,
                 from 7_3.c:1:
error.c: In function `err_doit':
error.c:121: warning: implicit declaration of function `vsnprintf'
error.c:123: warning: implicit declaration of function `snprintf'
7_3.c: In function `main':
7_3.c:15: warning: control reaches end of non-void function
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:ls
7_1.c  7_3.c  apue.h  ateixt*  error.c  verify_return_value*  verify_return_value_inLinux*  verify_return_value_inLinux_withc99*
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:date
Mon Oct  5 20:53:42 CDT 2015
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:ll
total 108
-rw-rw-r--  1 tingbinz tingbinz       61 Oct  5 20:01 7_1.c
-rw-rw-r--  1 tingbinz tingbinz      429 Oct  5 20:53 7_3.c
-rw-r--r--  1 tingbinz tingbinz     4650 Oct  5 19:58 apue.h
-rwxrwxr-x  1 tingbinz tingbinz    24290 Oct  5 20:53 ateixt
-rw-r--r--  1 tingbinz tingbinz     2282 Oct  5 19:58 error.c
-rwxrwxr-x  1 tingbinz tingbinz     7953 Oct  5 20:02 verify_return_value
-rwxrwxr-x  1 tingbinz tingbinz    21655 Oct  5 20:08 verify_return_value_inLinux
-rwxrwxr-x  1 tingbinz tingbinz    21271 Oct  5 20:11 verify_return_value_inLinux_withc99
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:./ateixt
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:ls

5 _exit 没有输出main done 初步怀疑是缓冲区没有写到terminal 加入flash 验证。

<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:vim 7_3.c
#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);


int main()
{
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit1) != 0)
                err_sys("register exit1 error!");
        if (atexit(my_exit2) != 0)
                err_sys("register exit2 error!");
        printf("main done");
        fflush(stdout);
        _exit(0);
}


static void my_exit1(void)
{
        printf("call exit1\n");
}


static void my_exit2(void)
{
        printf("call exit2\n");
}
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"7_3.c" 26L, 446C written
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:gcc -Wall -ggdb3 -o ateixt 7_3.c
In file included from apue.h:132,
                 from 7_3.c:1:
error.c: In function `err_doit':
error.c:121: warning: implicit declaration of function `vsnprintf'
error.c:123: warning: implicit declaration of function `snprintf'
7_3.c: In function `main':
7_3.c:16: warning: control reaches end of non-void function
<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:./ateixt
main done<bldc:/home/tingbinz/apue.3e/SBSCODE/7>R*_*G:

0 0