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 }
這是執行結果
使用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的用處就好理解了,只是個身份而已,並不能代表實際人物,就像一個假的名字
文件的粘滯位是什麼?有什麼作用?
普通文件的粘滯位會被操作系統內核無視,目錄文件被設置後表示這個目錄裡面的文件只能被擁有者和root刪除,粘滯位出現在可執行的位置上,用t表示,設置了該位之後,用戶就不能刪除不屬於他的目錄和文件。
例如tmp目錄,就被設置了粘滯位,我在/tmp目錄內部創建了子目錄文件
看!tmp目錄文件設置了粘滯位
創建了一個test普通文件和dirtest目錄文件,執行刪除
請求被拒絕。。。嘗試使用-rf強制刪除
同樣被拒絕,設置粘滯位的命令
chmod 777 dirtest chmod +t dirtest
這個也可以
chmod 1777 dirtest
對普通文件設置粘滯位並沒有什麼卵用,變成T了,最後被無視