1、atexit 函数解析
函数原型: int atexit(void (*function)(void));
包含头文件:#include <stdlib.h>
函数说明:atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数。
⼀个进程可以登记若⼲个(具体⾃⼰验证⼀下)个函数,这些函数由exit⾃动调⽤,这些函数被称为终⽌处理函数, atexit函数可以登记这些函数。 exit调⽤终⽌处理函数的顺序和atexit登记的顺序相反,如果⼀个函数被多次登记,也会被多次调⽤。
下面我们来验证atexit的调用顺序和退出顺序:
#include<stdio.h>
#include<stdlib.h>
void fun1()
{
printf("function:fun1\n");
}
void fun2()
{
printf("function:fun2\n");
}
void fun3()
{
printf("function:fun3\n");
}
void fun4()
{
printf("function:fun4\n");
}
int main()
{
atexit(fun1);
atexit(fun2);
atexit(fun3);
atexit(fun4);
printf("function:main\n");
return 0;
}
运行结果:function:main
function:fun4
function:fun3
function:fun2
function:fun1
我们可以看到atexit函数的调用顺序是和登记顺序相反的。
atexit函数的用途也是比较广泛的:可以按照你予设的顺序摧毁全局变量(类),例如有个log类,你在其它的全局类里也有可能调用到Log类写日志。所以log 类必须最后被析构 。假如没有规定析构顺序,那么程序在退出时将有可能首先析构log类,那么其它的全局类在此时将无法正确写日志。 把数据写回文件, 删除临时文件, 这才是真正有用的.
2、t(粘滞位)用途及测试
t(粘滞位) 目录方面的权限信息,当目录被设置了黏滞位以后用户拥有对目录的都写权限而非root用户不能删除该目录
当目录被黏滞位被设置以后其他⽤户权限处的“x”将变为“t”
粘滞位权限都是针对其他⽤户( other)设置,使⽤chmod命令设置⽬录权限时,
“o+t”、 “o-t”权限模式可分别⽤于添加、移除粘滞位权限。
此时普通⽤户m便⽆法删除user目录
3、FILE结构体
FILE结构体的定义,如下:
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //???这个什么意思
char *_tmpfname; //临时文件名