APUE学习笔记——7main()函数启动与退出
程序的启动与退出过程
先上图,了解进程运行的机制。
内核首先调用exec,运行C启动进程,C启动进程会调用main()函数。
其他所有函数都是由main函数直接或间接调用的。
从Figure7.2可以看出,内核与用户进程的交互,直接使用的只有三个函数:exec、_exit、_Exit
exec是用来启动C启动历程的,关于用户进程的退出,主要涉及以下三个函数:
#include <stdlib.h>void exit(int status); //进行了进程的清理工作,最后应该也是调用了_Exit()或者_exit()void _Exit(int status);#include <unistd.h>void _exit(int status);
int status表示程序退出的状态。
程序的终止atexit
以个程序可以等级至多32个终止程序,这些函数又atexit()登记,由exit()自动调用:
#include <stdlib.h>int atexit(void (*func)(void));Returns: 0 if OK, nonzero on error
exit调用终止程序的顺序与他们登记的顺序相反
接下来看一个例子
#include "apue.h"#include "myerr.h"static void my_exit1(void);static void my_exit2(void);intmain(void){if (atexit(my_exit2) != 0)err_sys("can’t register my_exit2");if (atexit(my_exit1) != 0)err_sys("can’t register my_exit1");if (atexit(my_exit1) != 0) //登记了两次my_exit1err_sys("can’t register my_exit1");printf("main is done\n");return(0);}static voidmy_exit1(void){printf("first exit handler\n");}static voidmy_exit2(void){printf("second exit handler\n");}
运行:因为return与exit相当,所以在main退出时会执行exit,并调用了登记的两个函数。注意顺序
windeal@ubuntu:~/Windeal/apue$ ./exemain is donefirst exit handlerfirst exit handlersecond exit handler
注意:两个登记的函数,在return(相当于exit)时被执行,因为exit会做清理工作,会调用登记的两个函数
如果我们直接使用_exit()或者_Exit()直接退出,则链各个登记的函数变不会被调用。

浙公网安备 33010602011771号