atexit函数&&t(粘滞位)用途及测试&&FILE结构体

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; //临时文件名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值