Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268799
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: 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 的对象(例如通过指针),除非是它自己所定义的。多次注册同一个函数将导致这个函数被多次调用。




来看一个例子:

结果:


我们为什么需要atexit?

     按照你予设的顺序摧毁全局变量(类)。例如有个log类,你在其它的全局类里也有可能调用到Log类写日志。所以log类必须最后被析构。假如没有规定析构顺序,那么程序在退出时将有可能首先析构log类,那么其它的全局类在此时将无法正确写日志。
      把数据写回文件, 删除临时文件, 这才是真正有用的。

三、粘滞位(参考维基百科)

     粘滞位(Sticky bit),或粘着位,是Unix文件系统限权的一个旗标。

    最常见的用法在目录上设置粘滞位
,如此以来,只有目录内文件的所有者或者才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。

    实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件


    使用chmod命令设置粘滞位,通过八进制语法模式1000或符号模式"t"。
例如:  
    为一个目录/usr/local/tmp设置粘滞位,使用chmod +t /usr/local/tmp或chmod 1777 /usr/local/tmp。清除粘滞位,chmod -t /usr/local/tmp 或 chmod 0777 /usr/local/tmp。
阅读(2469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~