atexit函数和两种特殊文件权限位
2016-06-20 19:35
260 查看
[b]atexit函数[/b]
atexit函数的原型如下 void atexit(void (*func)(void)) 它是一个参数为返回值和参数均为空的函数指针的函数,含义是当前进程结束之前执行参数函数指针所指向的函数,使用的时候要在main中注册,一次可以注册很多函数,函数的执行顺序与注册的先后有关,关系恰好相反,第一个注册的函数反而是最后一个执行。下面是执行实例。
这是执行结果
[b]uid,euid,suid[/b]
使用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文件
很显然,访问它是非法的,更不可能往里面写东西,现在我企图用文件指针打开他,往里面写入东西
使用普通用户执行该程序
直接报告段错误,被拒绝了
设置用户id
再次执行,成功写入,我们发现这时候打印出来的uid和euid不同,虽然实际用户身份是普通用户,但是当前有效用户身份是root!这样euid的用处就好理解了,只是个身份而已,并不能代表实际人物,就像一个假的名字
[b]粘滞位(sticky)[/b]
文件的粘滞位是什么?有什么作用?
普通文件的粘滞位会被操作系统内核无视,目录文件被设置后表示这个目录里面的文件只能被拥有者和root删除,粘滞位出现在可执行的位置上,用t表示,设置了该位之后,用户就不能删除不属于他的目录和文件。
例如tmp目录,就被设置了粘滞位,我在/tmp目录内部创建了子目录文件
看!tmp目录文件设置了粘滞位
创建了一个test普通文件和dirtest目录文件,执行删除
请求被拒绝。。。尝试使用-rf强制删除
同样被拒绝,设置粘滞位的命令
这个也可以
对普通文件设置粘滞位并没有什么卵用,变成T了,最后被无视
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 0; }
这是执行结果
[b]uid,euid,suid[/b]
使用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,1,strlen(buffer),fp); return 0; }
使用普通用户执行该程序
直接报告段错误,被拒绝了
设置用户id
再次执行,成功写入,我们发现这时候打印出来的uid和euid不同,虽然实际用户身份是普通用户,但是当前有效用户身份是root!这样euid的用处就好理解了,只是个身份而已,并不能代表实际人物,就像一个假的名字
[b]粘滞位(sticky)[/b]
文件的粘滞位是什么?有什么作用?
普通文件的粘滞位会被操作系统内核无视,目录文件被设置后表示这个目录里面的文件只能被拥有者和root删除,粘滞位出现在可执行的位置上,用t表示,设置了该位之后,用户就不能删除不属于他的目录和文件。
例如tmp目录,就被设置了粘滞位,我在/tmp目录内部创建了子目录文件
看!tmp目录文件设置了粘滞位
创建了一个test普通文件和dirtest目录文件,执行删除
请求被拒绝。。。尝试使用-rf强制删除
同样被拒绝,设置粘滞位的命令
chmod 777 dirtest chmod +t dirtest
这个也可以
chmod 1777 dirtest
对普通文件设置粘滞位并没有什么卵用,变成T了,最后被无视
相关文章推荐
- 玄学啊
- Android开发笔记(十)TimePiker的使用方法
- 【C++】泛型编程基础:模板通识
- Redis源码解析:25集群(一)握手、心跳消息以及下线检测
- Oracle中的NVL函数
- spring boot 第二课-完成单表操作及分页查询
- PostSharp AOP
- 【iOS】App Transport Security
- 红烧萝卜
- 分步骤实现操作
- 2-1什么是变量
- 树形dp--清洁机器人 nkoj3695
- 枚举把值放到map里
- [置顶] Unity中通过场景切换但音乐继续播放
- 洋葱炒肉
- gson转换list对象
- Single Number
- RtlZeroMemory
- 图描述之:流程图
- HDU 1269 迷宫城堡