函式chown、fchown、fchownat和lchown

2puT發表於2016-07-12

下面幾個chown函式可用於更改檔案的使用者ID和組ID。如果兩個引數owner或group中的任意一個是-1,則對應的ID不變。
 

  1. #include <unistd.h>    
  2.  
  3. int chown(const char *pathname, uid_t owner, gid_t group);    
  4.  
  5. int fchown(int fd, uid_t owner, gid_t group);     
  6.  
  7. int fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag);     
  8.  
  9. int lchown(const char *pathname, uid_t owner, gid_t group);     
  10.  
  11. 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位都被清除。

相關文章