4 9 chmod和fchmod函式 檔案許可權修改

2021-06-19 00:30:49 字數 1703 閱讀 2663

chmod和fchmod函式用於儲存stat.st_mode成員所代表的檔案屬性到磁碟。函式原型:

#include int chmod(const char *pathname, mode_t mode);

int fchmod(int filedes, mode_t mode);

返回值:若成功則返回0,若出錯則返回-1

引數:pathname檔案路徑

filedes檔案識別符號

mode許可權模式字,是一些許可權常數的組合。

兩個函式的作用相同,只是引數略有不同:chmod函式在指定的檔案上進行操作,而fchmod函式則對以開啟的檔案進行操作。

因為涉及到檔案訪問許可權的更改,所以呼叫這兩個函式需要以下兩個特權之一:

(1)程序的有效使用者id必須等於檔案的所有者id;

(2)程序必須具有超級使用者許可權(例如root)。

函式呼叫並不複雜,只是mode值的構造有點繁瑣。參考《4.5 檔案訪問許可權》和《4.4 s_isuid、s_isgid位與檔案訪問許可權檢查》。

注意:直接修改檔案的stat.st_mode成員的值不會對檔案產生實際影響,這些修改只是發生在記憶體,不會影響到檔案在檔案系統中的實際屬性。需要呼叫這兩個函式才能儲存更改後的st_mode屬性到磁碟。

例項 x.4.9.1.c

#include #include #include #include int main(int argc, char *argv)

編譯與執行:

[root@localhost unixc]# cc x.4.9.1.c

[root@localhost unixc]# echo "this is file1" > /tmp/myfile1

[root@localhost unixc]# echo "this is file2" > /tmp/myfile2

[root@localhost unixc]# ls -l /tmp/myfile1 /tmp/myfile2

-rw-r--r--. 1 root root 14 nov  4 09:11 /tmp/myfile1

-rw-r--r--. 1 root root 14 nov  4 09:11 /tmp/myfile2

[root@localhost unixc]# ./a.out

[root@localhost unixc]# ls -l /tmp/myfile1 /tmp/myfile2

-rw-------. 1 root root 14 nov  4 09:11 /tmp/myfile1

-rw-rw----. 1 root root 14 nov  4 09:11 /tmp/myfile2

[root@localhost unixc]# 

本例為了簡化直接用組合值來更改檔案的屬性而不理睬檔案原來的屬性。實際應用中,我們只是關心某個或某些許可權位而無需知道其他的許可權位狀態。所以實際修改流程是這樣:

1、先用stat函式取得檔案原來的mode值;(參考《4.2 stat函式》)

2、以原來的mode值為基礎做一些位運算;(參考《4.5 檔案訪問許可權》和《4.4 s_isuid、s_isgid位與檔案訪問許可權檢查》)

3、用chmod或fchmod函式把新mode值儲存到檔案。(參考本例)

3 12 檔案I O dup和dup2函式

下面兩個函式都可用來複製乙個現存的檔案描述符 返回值 成功返回新的檔案描述符,出錯返回 1 有dup返回的新檔案描述符一定是當前可用檔案描述符的最小數值。用dup2則可以用filedes2引數指定新描述符的數值。如果filedes2已經開啟,則先將其關閉。如若filedes等於filedes2,則d...

一文搞懂Golang 時間和日期相關函式

目錄 在程式設計中,程式設計師會經常使用到日期相關的函式,比如 統計某段 執行花費的時間等等。在 go 中,開發者為我們提供了time包,用於顯示時間以及測量使用 日曆的計算採用的是公曆 詳細資訊見 golang 的標準庫 1 time.time型別 用於表示時間 package main impo...

一文搞懂python例項屬性和函式的用法

初學python的人,一定會感覺到python中例項屬性和函式的用法超級靈活,寫這篇也主要是給小白看的,能夠快速的掌握py中例項屬性和函式的呼叫方法。接下來請不要錯過每乙個字.class teacher object def init self,name self.name name self.ot...