c程序总是从main函数开始执行。main函数的原型是
int main(int argc,char *argv[]);
其中,argc是命令行参数,argv是指向参数的各个指针所构成的数组。
当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址----这是由连接编辑器设置的,而连接编辑器则由C编译器(通常是CC)调用。启动例程从内核取得命令行参数和环境变量,然后为按上述方式调用main函数做好安排。
有8种方式使得进程终止(termination),其中5种是正常终止:1)从main函数返回 2)调用exit 3)调用_exit或_Exit 4)最后一个线程从启动例程返回 5)最后一个线程调用pthread_exit
3种异常终止:1)调用abort 2)接受到一个信号兵终止 3)最后一个线程对取消请求做出响应
注意:内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显示或隐式地(通过调用exit)调用_exit 或_Exit。进程也可非自愿地由一个信号使其终止(上图没有显示)
在进程结束的时候,可以用atexit函数来登记一些函数(被称为 终止处理程序(exit handle)),这些函数将由exit自动调用。
atexit函数原型为
int atexit(void (*func)(void)); 参数是一个函数地址。
exit调用这些终止处理程序的顺序与他们登记的时候相反。同一个函数如果被登记多次,则也会被调用多次。
执行改程序产生:
$./a.out
main is done
first exit handler
first exit handler
second exit handler