1.普通文件
2.目錄
3.字符特殊設備
4.塊特殊設備
5.FIFO,又叫命名管道
6.Socket,即套接字
7.符號鏈接
int stat(const char* pathname,struct stat* buf);
int fstat(int filedes,struct stat* buf);
int lstat(const char* pathname,struct stat* buf);
struct stat
{mode_t st_mode; //文件的類型和權限ino_t st_ino; //inode的節點號dev_t st_dev; //設備號dev_t st_rdev; //特殊設備號nlink_t st_nlink; //連接數uid_t st_uid; //文件所有者gid_t st_gid; //文件所屬組off_t st_st_size; //文件的字節數time_t st_atime; //文件的最后存取時間time_t mtime; //文件的最后修改時間time_t ctime; //文件權限的最后修改時間long st_blksize; //最佳的IO塊長度long st_blocks; //512字節的塊數
};
S_ISREG();判斷普通文件
S_ISDIR(); 判斷目錄
S_ISCHR(); 判斷特殊字符設備
S_ISBLK(); 判斷塊特殊設備
S_ISFIFO(); 判斷FIFO
S_ISSOCK(); 判斷是否為Socket
S_ISLNK(); 判斷是否為符號鏈接
???? 對每個文件都有九個基本相關的存取許可權,如下:
S_IRUSR 用戶讀
S_IWUSR 用戶寫
S_IXUSR 用戶執行S_IRGRP 組讀
S_IWGRP 組寫
S_IXGRP 組執行S_IROTH 其他用戶讀
S_IWOTH 其他用戶寫
S_IXOTH 其他用戶執行
在一個進程打開文件時,會按下面四步來進行:
1.先檢查改進程的有效用戶ID,如果為0,說明是超級用戶,則系統給改進程充分的自由去操作文件,否則進入下一步檢查。
2.檢查進程的有效用戶ID和文件所有者ID是否相同,如果相同則按照該文件的所有者的權限進行相關的檢查,符合權限則允許操作,不符合則拒絕,直接結束。ID不同則進入下一步
3.檢查進程的有效組ID和文件所屬組的ID是否相同,如果相同則按照該文件組的權限進行相關檢查,符合權限則允許操作,不符合則拒絕,直接結束。ID不同則進入下一步
4.按照該文件其他用戶的權限進行相關檢查,符合權限則允許操作,不符合則拒絕,直接結束。
這里需要說明的是有效ID和實際ID在大多數情況下是相同的,但是當設置SUID和SGID權限時,有效ID和實際ID就不同了。另外有效ID是進程的一個性質,但是實際ID是文件的一個性質。每當新建一個文件的時候,該文件的所有者和創建文件進程的有效ID相同,該文件所屬的組和該進程的有效組ID相同,也可能是該文件的組和該文件所在目錄所屬的組相同。
???? access函數用進程的實際ID來測試進程對文件的權限,它的函數原型如下:
int access(const char* pathname,int mode);
R_OK 測試讀許可權
W_OK 測試寫許可權
X_OK 測試執行許可權
F_OK 測試文件是否存在
unix環境高級編程第三版pdf、
???? 相信在linux下面使用過umask命令的朋友們,都對umask函數的作用一定也了解。umask函數的作用就是在進程執行時,調整umask的值,給進程創建的文件設置合適的權限,當該進程結束時,umask仍保持原來系統中的值不變。它的函數原型如下:
mode_t umask(mode_t cmask);
它的返回值是原來的umask的值,這也是linux系統中少數幾個沒有出錯返回值的幾個函數之一。它的作用是從創建文件時指定的權限中減掉umask中指定的權限。比如,進程創建文件時指定的用戶權限是:
rwxrwxrwx
???? chmod和fchmod函數用來改變文件的權限,它們的函數原型如下:
int chmod(const char* pathname,mode_t mode);
int fchmod(int filedes,mode_t mode);
S_ISUID 是否為SUID
S_ISGID 是否為SGID
S_ISVTX 是否為SBITS_IRWXU 用戶讀寫執行
S_IRUSR 用戶讀
S_IWUSR 用戶寫
S_IXUSR 用戶執行S_IRWXG 組讀寫執行
S_IRGRP 組讀
S_IWGRP 組寫
S_IXGRP 組執行S_IRWXO 其他讀寫執行
S_IROTH 其他讀
S_IWOTH 其他寫
S_IXOTH 其他執行
linux開發需要學什么?
該函數如果執行成功則返回0,若出錯返回-1。關于SUID,SGID和SBIT的相關說明請參考另一篇博客:
http://blog.csdn.net/xiaocainiaoshangxiao/article/details/17378611
???? chown,fchown以及lchown用來改變文件的所有者和所屬的組,它們的函數原型如下:
int chown(const char* pathname, uid_t owner, gid_t group);
int fchown(int filedes , uid_t owner, gid_t group);
int lchown(const char* filename ,uid_t owner ,gid_t group);
當該函數執行成功時,返回0,出錯則返回-1。修改文件的用戶ID需要據進程的有效用戶ID為超級用戶。當進程的有效用戶ID等于文件的用戶ID時,可以修改該文件組ID。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态