zoukankan      html  css  js  c++  java
  • atexit函数和两种特殊文件权限位

    • atexit函数

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

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 
     5 void func1()
     6 {
     7   printf("this is func1
    ");
     8 }
     9 
    10 void func4()
    11 {
    12   printf("this is func4
    ");
    13 
    14 }
    15 
    16 
    17 void func3()
    18 {
    19   printf("this is func3
    ");
    20 }
    21 
    22 
    23 void func2()
    24 {
    25   printf("this is func2
    ");
    26 }
    27 
    28 void func0()
    29 {
    30   printf("this is func0
    ");
    31 }
    32 void func6()
    33 {
    34   printf("this is func6
    ");
    35 }
    36 void a()
    37 {
    38   printf("this is a
    ");
    39 }
    40 void z()
    41 {
    42   printf("this is z
    ");
    43 }
    44 
    45 
    46 int main()
    47 {
    48   atexit(func3);
    49   atexit(func1);
    50   atexit(func2);
    51   
    52   atexit(func4);
    53   atexit(func0);
    54   atexit(func6);
    55   atexit(a);
    56   atexit(z);
    57   return 0;
    58 }

    这是执行结果

    • 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文件

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

     1  #include<stdio.h>
     2   
     3 
     4  #include<string.h>
     5  
     6                                                                              
     7  int main()
     8  {
     9    FILE *fp;
    10    printf("uid:%d   euid:%d",getuid(),geteuid());
    11    fp=fopen("log","w");
    12    if(fp==NULL)
    13    {
    14      printf("fopen error");
    15    }
    16    char *buffer="hello world";
    17   
    18    fwrite(buffer,1,strlen(buffer),fp);
    19   
    20    return 0;
    21  }

    使用普通用户执行该程序

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

    设置用户id

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

    • 粘滞位(sticky)

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

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

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

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

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

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

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

    chmod 777 dirtest
    chmod +t dirtest

    这个也可以

    chmod 1777 dirtest

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

  • 相关阅读:
    SecureCRT上传文件到服务器 CentOS举例
    MongoDB关于replSet的配置概述(一主二从)
    MongoDB的安装与卸载与再安装……
    zip在python中的使用方法
    try,raise等的python的使用方法介绍
    【转】jQuery给动态添加的元素绑定事件的方法
    sublime的纵向操作(列操作)原来这么用
    Python 利用*args和**kwargs解决函数遇到不确定数量参数问题
    Python 函数式编程介绍
    Python list可以做什么
  • 原文地址:https://www.cnblogs.com/lenomirei/p/5587721.html
Copyright © 2011-2022 走看看