程序的启动与退出过程
先上图,了解进程运行的机制。
内核首先调用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);
int
main(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_exit1
err_sys("can’t register my_exit1");
printf("main is done ");
return(0);
}
static void
my_exit1(void)
{
printf("first exit handler ");
}
static void
my_exit2(void)
{
printf("second exit handler ");
}
运行:因为return与exit相当,所以在main退出时会执行exit,并调用了登记的两个函数。注意顺序
windeal@ubuntu:~/Windeal/apue$ ./exe
main is done
first exit handler
first exit handler
second exit handler
注意:两个登记的函数,在return(相当于exit)时被执行,因为exit会做清理工作,会调用登记的两个函数
如果我们直接使用_exit()或者_Exit()直接退出,则链各个登记的函数变不会被调用。