詳細對比C語言中的chmod()函式和fchmod()函式

2puT發表於2016-07-12

C語言chmod()函式:修改檔案許可權
標頭檔案:

1
#include <sys/types.h>  #include <sys/stat.h>

定義函式:

1
int chmod(const char * path, mode_t mode);

函式說明:chmod()會依引數mode 許可權來更改引數path 指定檔案的許可權。

引數 mode 有下列數種組合:
1、S_ISUID 04000 檔案的 (set user-id on execution)位
2、S_ISGID 02000 檔案的 (set group-id on execution)位
3、S_ISVTX 01000 檔案的sticky 位
4、S_IRUSR (S_IREAD) 00400 檔案所有者具可讀取許可權
5、S_IWUSR (S_IWRITE)00200 檔案所有者具可寫入許可權
6、S_IXUSR (S_IEXEC) 00100 檔案所有者具可執行許可權
7、S_IRGRP 00040 使用者組具可讀取許可權
8、S_IWGRP 00020 使用者組具可寫入許可權
9、S_IXGRP 00010 使用者組具可執行許可權
10、S_IROTH 00004 其他使用者具可讀取許可權
11、S_IWOTH 00002 其他使用者具可寫入許可權
12、S_IXOTH 00001 其他使用者具可執行許可權

注:只有該檔案的所有者或有效使用者識別碼為0,才可以修改該檔案許可權。

基於系統安全,如果欲將資料寫入一執行檔案,而該執行檔案具有S_ISUID 或S_ISGID 許可權,則這兩個位會被清除。如果一目錄具有S_ISUID 位許可權,表示在此目錄下只有該檔案的所有者或root 可以刪除該檔案。

返回值:許可權改變成功返回0, 失敗返回-1, 錯誤原因存於errno.

錯誤程式碼:
1、EPERM 程式的有效使用者識別碼與欲修改許可權的檔案擁有者不同, 而且也不具root 許可權.
2、EACCESS 引數path 所指定的檔案無法存取.
3、EROFS 欲寫入許可權的檔案存在於只讀檔案系統內.
4、EFAULT 引數path 指標超出可存取記憶體空間.
5、EINVAL 引數mode 不正確
6、ENAMETOOLONG 引數path 太長
7、ENOENT 指定的檔案不存在
8、ENOTDIR 引數path 路徑並非一目錄
9、ENOMEM 核心記憶體不足
10、ELOOP 引數path 有過多符號連線問題.
11、EIO I/O 存取錯誤

範例

1
2
3
4
5
6
7
/* 將/etc/passwd 檔案許可權設成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */
#include <sys/types.h>
#include <sys/stat.h>
main()
{
  chmod("/etc/passwd", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
}

C語言fchmod()函式:修改檔案的許可權
標頭檔案:

1
#include <sys/types.h>  #include <sys/stat.h>

定義函式:

1
int fchmod(int fildes, mode_t mode);

函式說明:fchmod()會依引數mode 許可權來更改引數fildes 所指檔案的許可權。引數fildes 為已開啟檔案的檔案描述詞。引數mode 請參考chmod ()。

返回值:許可權改變成功則返回0, 失敗返回-1, 錯誤原因存於errno.

錯誤程式碼:
1、EBADF 引數fildes 為無效的檔案描述詞。
2、EPERM 程式的有效使用者識別碼與欲修改許可權的檔案所有者不同, 而且也不具root 許可權。
3、EROFS 欲寫入許可權的檔案存在於只讀檔案系統內。
4、EIO I/O 存取錯誤。

範例

1
2
3
4
5
6
7
8
9
#include <sys/stat.h>
#include <fcntl.h>
main()
{
  intfd;
  fd = open("/etc/passwd", O_RDONLY);
  fchmod(fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
  close(fd);
}

相關文章