歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> atexit函數和兩種特殊文件權限位

atexit函數和兩種特殊文件權限位

日期:2017/3/1 9:14:44   编辑:Linux編程

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\n");
 8 }
 9 
10 void func4()
11 {
12   printf("this is func4\n");
13 
14 }
15 
16 
17 void func3()
18 {
19   printf("this is func3\n");
20 }
21 
22 
23 void func2()
24 {
25   printf("this is func2\n");
26 }
27 
28 void func0()
29 {
30   printf("this is func0\n");
31 }
32 void func6()
33 {
34   printf("this is func6\n");
35 }
36 void a()
37 {
38   printf("this is a\n");
39 }
40 void z()
41 {
42   printf("this is z\n");
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了,最後被無視

Copyright © Linux教程網 All Rights Reserved