函式chown、fchown、fchownat和lchown
下面幾個chown函式可用於更改檔案的使用者ID和組ID。如果兩個引數owner或group中的任意一個是-1,則對應的ID不變。
- #include <unistd.h>
- int chown(const char *pathname, uid_t owner, gid_t group);
- int fchown(int fd, uid_t owner, gid_t group);
- int fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag);
- int lchown(const char *pathname, uid_t owner, gid_t group);
- 4個函式的返回值:若成功,返回0;若出錯,返回-1
除了所引用的檔案是符號連結以外,這4個函式的操作類似。在符號連結情況下,lchown和fchownat(設定了AT_SYMLINK_NOFOLLOW標誌)更改符號連結本身的所有者,而不是該符號連結所指向的檔案的所有者。
fchown函式改變fd引數指向的開啟檔案的所有者,既然它在一個已開啟的檔案上操作,就不能用於改變符號連結的所有者。
fchownat函式與chown或者lchown函式在下面兩種情況下是相同的:一種是pathname引數為絕對路徑,另一種是fd引數取值為AT_FDCWD而pathname引數為相對路徑。在這兩種情況下,如果flag引數中設定了AT_SYMLINK_NOFOLLOW標誌,fchownat與lchown行為相同,如果flag引數中清除了AT_SYMLINK_NOFOLLOW標誌,則fchownat與chown行為相同。 如果fd引數設定為開啟目錄的檔案描述符,並且pathname引數是一個相對路徑名,fchownat函式計算相對於開啟目錄的pathname。
基於BSD的系統一直規定只有超級使用者才能更改一個檔案的所有者。這樣做的原因是防止使用者改變其檔案的所有者從而擺脫磁碟空間限額對他們的限制。System V則允許任一使用者更改他們所擁有的檔案的所有者。
按照_POSIX_CHOWN_RESTRICTED的值,POSIX.1允許在這兩種形式的操作中選用一種。
對於Solaris 10,此功能是個配置選項,其預設值是施加限制。而FreeBSD 8.0、Linux 3.2.0和Mac OS X 10.6.8則總對chown施加限制。
回憶2.6節,_POSIX_CHOWN_RESTRICTED常量可選地定義在標頭檔案<unistd.h>中,而且總是可以用pathconf或fpathconf函式進行查詢。此選項還與所引用的檔案有關—可在每個檔案系統基礎上,使該選項起作用或不起作用。在下文中,如提及“若_POSIX_CHOWN_ RESTRICTED生效”,則表示“這適用於我們正在談及的檔案”,而不管該實際常量是否在標頭檔案中定義。
若_POSIX_CHOWN_RESTRICTED對指定的檔案生效,則
(1)只有超級使用者程式能更改該檔案的使用者ID;
(2)如果程式擁有此檔案(其有效使用者ID等於該檔案的使用者ID),引數owner等於-1或檔案的使用者ID,並且引數group等於程式的有效組ID或程式的附屬組ID之一,那麼一個非超級使用者程式可以更改該檔案的組ID。
這意味著,當_POSIX_CHOWN_RESTRICTED有效時,不能更改其他使用者檔案的使用者ID。你可以更改你所擁用的檔案的組ID,但只能改到你所屬的組。
如果這些函式由非超級使用者程式呼叫,則在成功返回時,該檔案的設定使用者ID位和設定組ID位都被清除。相關文章
- C語言chown()函式:改變檔案所有者C語言函式
- chown
- 字元函式、數字函式和日期函式字元函式
- 類函式和物件函式 PHP函式物件PHP
- 函式防抖和函式節流函式
- 函式基礎和函式引數函式
- Rust中的into函式和from函式Rust函式
- Python strip函式和split函式Python函式
- ascii函式和substr函式的用法ASCII函式
- 指標函式 和 函式指標指標函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- 函式宣告和函式表示式的區別函式
- Oracle OCP(03):字元函式、數字函式和日期函式Oracle字元函式
- [Bash] chmod and chown
- StretchBlt函式和BitBlt函式的區別和用法函式
- Kotlin之“with”函式和“apply”函式Kotlin函式APP
- JS函式節流和函式防抖JS函式
- gethostbyname函式和getservbyname函式的應用函式
- Socket send函式和recv函式詳解函式
- prop()函式和attr()函式的區別函式
- ES6-Generator 函式 和 async 函式函式
- JS閉包函式和回撥函式JS函式
- Python私有函式和公開函式Python函式
- C++的函式和模板函式 (轉)C++函式
- strcpy函式和memcpy函式的區別函式memcpy
- 函式表示式和函式宣告簡單介紹函式
- Python技法3:匿名函式、回撥函式和高階函式Python函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- JavaScript中的compose函式和pipe函式JavaScript函式
- 函式柯里化和偏函式應用函式
- java自定義equals函式和hashCode函式Java函式
- 【Spark篇】---SparkSql之UDF函式和UDAF函式SparkSQL函式
- jquery position()函式和offset()函式的區別jQuery函式
- # 普通函式和箭頭函式的區別函式
- iOS-GCD常用函式和柵欄函式iOSGC函式
- const放在函式前和放在函式後函式
- Oracle 中 replace函式和translate函式比較Oracle函式
- open和close函式函式