growing
分类: LINUX
2016-06-15 10:09:14
一、一个典型程序的大致运行步骤
1.操作系统创建进程后,把控制权交到程序入口,这个入口往往是程序运行库中的某个入口函数。
2.入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量的构造等等。
3.入口函数在完成初始化之后,调用main函数,正式开始执行函数主体部分。
4.main函数执行完毕之后,返回到入口函数,入口函数进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程。
注:一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前。而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作。
二、atexit
用atexit注册的函数也会在main之后执行。
atexit 函数是标准 C 新增的。 它“注册”一个函数,使这个函数将在 exit
函数被调用时或者当 mian 函数返回时被调用。当程序异常终止时(例如调用 abort 或 raise),通过它注册的函数并不会被调用。
编译器必须至少允许程序员注册32个函数。如果注册成功,atexit 返回0,否则返回非零值。
没有办法取消一个函数的注册。在 exit
所执行的任何标准清理操作之前,被注册的函数按照与注册顺序相反的顺序被依次调用。每个被调用的函数不接受任何参数,并且返回类型是
void。被注册的函数不应该试图引用任何存储类别为 auto 或 register
的对象(例如通过指针),除非是它自己所定义的。多次注册同一个函数将导致这个函数被多次调用。
粘滞位(Sticky bit),或粘着位,是Unix文件系统限权的一个旗标。
最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。
实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。