• atexit函数

atexit函数的原型如下 void atexit(void (*func)(void)) 它是一个参数为返回值和参数均为空的函数指针的函数,含义是当前进程结束之前执行参数函数指针所指向的函数,使用的时候要在main中注册,一次可以注册很多函数,函数的执行顺序与注册的先后有关,关系恰好相反,第一个注册的函数反而是最后一个执行。下面是执行实例。

 #include<stdio.h>
#include<stdlib.h> void func1()
{
printf("this is func1\n");
} void func4()
{
printf("this is func4\n"); } void func3()
{
printf("this is func3\n");
} void func2()
{
printf("this is func2\n");
} void func0()
{
printf("this is func0\n");
}
void func6()
{
printf("this is func6\n");
}
void a()
{
printf("this is a\n");
}
void z()
{
printf("this is z\n");
} int main()
{
atexit(func3);
atexit(func1);
atexit(func2); atexit(func4);
atexit(func0);
atexit(func6);
atexit(a);
atexit(z);
return ;
}

这是执行结果

  • uid,euid,suid

使用ps -l命令就可以看见一些信息,PID和PPID就不详细说了分别是该进程和父进程的ID号,这次详细讲的是UID和相关的EUID和SUID,分别代表什么呢

UID:代表实际用户ID,下图中也有显示,当前我是用的是ROOT用户显示的UID就是0,如果是普通用户一般会比0大,我的一般用户UID是1000

EUID:代表有效用户ID,一般uid和euid都是一样的。。。

SUID:代表设置用户id(只能使用在可执行程序上,因为使用之后权限的x位会变为s),不一样的时候来了!当你设置了该位之后,执行该文件时你的euid会提升到该文件的持有者。使用这一功能的例子有passwd这条命令,按理说只有root有权限更改用户密码,但是普通用户也可以使用passwd更改密码,就是使用了设置用户id。

实现方法如下首先建立一个什么权限都不提供的log文件

很显然,访问它是非法的,更不可能往里面写东西,现在我企图用文件指针打开他,往里面写入东西

  #include<stdio.h>

  #include<string.h>

  int main()
{
FILE *fp;
printf("uid:%d euid:%d",getuid(),geteuid());
fp=fopen("log","w");
if(fp==NULL)
{
printf("fopen error");
}
char *buffer="hello world"; fwrite(buffer,,strlen(buffer),fp); return ;
}

使用普通用户执行该程序

直接报告段错误,被拒绝了

设置用户id

再次执行,成功写入,我们发现这时候打印出来的uid和euid不同,虽然实际用户身份是普通用户,但是当前有效用户身份是root!这样euid的用处就好理解了,只是个身份而已,并不能代表实际人物,就像一个假的名字

  • 粘滞位(sticky)

文件的粘滞位是什么?有什么作用?

普通文件的粘滞位会被操作系统内核无视,目录文件被设置后表示这个目录里面的文件只能被拥有者和root删除,粘滞位出现在可执行的位置上,用t表示,设置了该位之后,用户就不能删除不属于他的目录和文件。

例如tmp目录,就被设置了粘滞位,我在/tmp目录内部创建了子目录文件

看!tmp目录文件设置了粘滞位

创建了一个test普通文件和dirtest目录文件,执行删除

请求被拒绝。。。尝试使用-rf强制删除

同样被拒绝,设置粘滞位的命令

chmod  dirtest
chmod +t dirtest

这个也可以

chmod  dirtest

对普通文件设置粘滞位并没有什么卵用,变成T了,最后被无视

atexit函数和两种特殊文件权限位的更多相关文章

  1. (转)DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...

  2. 【转】DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...

  3. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  4. C模块回调Lua函数的两种方法

    作者:ani_di 版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di C模块回调Lua函数的两种方法 lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平 ...

  5. Git 的两种忽略文件方式 gitignore 和 exclude

    Git 的两种忽略文件方式 gitignore 和 exclude .gitignore 不用说了,大家都知道. 有一个 exclude 可能接触比较少. 知道这个功能后发现,用在服务器上非常方便,因 ...

  6. strcmp函数的两种实现

    strcmp函数的两种实现,gcc测试通过. 一种实现: C代码   #include<stdio.h> int strcmp(const char *str1,const char *s ...

  7. DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接 ...

  8. dll导出函数的两种方式的比较

    最初的网页链接已经挂了, 在此贴一个中间的转载链接 https://blog.csdn.net/zhazhiqiang/article/details/51577523 一 概要 vs中导出 dll的 ...

  9. DLL声明导出函数的两种方式

    DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport):另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出.属 ...

随机推荐

  1. (整理)SQLServer 大数据的插入与查询

    最近几天一直在折腾大数据量的查询,最后在索引.分页存储过程和控件以及视图的帮助下,搞定了.这篇文章记录解决问题时候查看的网友的分享链接,以及大数据量数据的插入链接. DatagridView Virt ...

  2. 在 Visual Studio Code 中使用 PoweShell - CodeShell

    一直希望在 Visual Studio Code 中使用 PowerShell,插件 CodeShell 提供了对于 PowerShell 的支持. 安装 首先按 F1,打开命令窗口,输入安装插件的命 ...

  3. Linux 本人常用到的基本命令

    cat -n FileName //查看FileName文件的内容.-n显示对应行号. yum install SoftName //安装软件,切记使用root权限. service //查看服务.例 ...

  4. brew安装

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545 } span.s1 { font: 12. ...

  5. 初探 performance – 监控网页与程序性能

    使用 window.performance 提供了一组精确的数据,经过简单的计算就能得出一些网页性能数据. 配合上报一些客户端浏览器的设备类型等数据,就可以实现简单的统计啦! 额,先看下兼容性如何:h ...

  6. yum命令指南

    yum check-update  检查可更新的所有软件包 yum update  下载更新系统已安装的所有软件包yum upgrade  大规模的版本升级,与yum update不同的是,连旧的淘汰 ...

  7. 【EF学习笔记07】----------加载关联表的数据 贪婪加载

    讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entities()) { var classes = db.Classes.Wh ...

  8. Yarn&Mapreduce参数的具体含义和配置参考

    Yarn & Mapreduce 参数的具体含义和配置 http://zh.hortonworks.com/blog/how-to-plan-and-configure-yarn-in-hdp ...

  9. C#算法之向一个集合中插入随机不重复的100个数

    一道非常经典的C#笔试题: 需求:请使用C#将一个长度为100的int数组,插入1-100的随机数,不能重复,要求遍历次数最少. 1.最简单的办法 var rd = new Random(); Lis ...

  10. VC++ excel 2 operations

    LPDISPATCH lpDisp;   //lpdispatch,接口指针 // 设置为FALSE时,加上app.Quit(); // 否则EXCEL.EXE进程会一直存在,并且每操作一次就会多开一 ...