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了,最後被無視