unix環境高級編程第三版pdf,文件和目錄(一)--unix環境高級編程

 2023-11-19 阅读 23 评论 0

摘要:普通文件和目錄linux中最多的兩類文件,linux中一共有七種類型的文件,如下: 1.普通文件 2.目錄 3.字符特殊設備 4.塊特殊設備 5.FIFO,又叫命名管道 6.Socket,即套接字 7.符號鏈接 獲取一個文件的詳細信息可以使用stat函數組,stat函數
普通文件和目錄linux中最多的兩類文件,linux中一共有七種類型的文件,如下:
1.普通文件
2.目錄
3.字符特殊設備
4.塊特殊設備
5.FIFO,又叫命名管道
6.Socket,即套接字
7.符號鏈接

獲取一個文件的詳細信息可以使用stat函數組,stat函數組包括三個函數,它們的函數原型如下:
int stat(const char* pathname,struct stat* buf);
int fstat(int filedes,struct stat* buf);
int lstat(const char* pathname,struct stat* buf);

這三個函數的功能大同小異,都是將一個文件的相關信息存入到一個stat結構體變量中,也就是提供的第二個參數。stat函數的第一個參數為文件的路徑名字,fstat的第一個參數為打開文件的文件描述符,lstat函數與前面的兩個函數一個最大的不同是它并不跟隨符號鏈接,即獲得的不是符號鏈接指向的文件的信息,而是符號鏈接本身的信息。stat這個結構體中的成員如下:
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字節的塊數
};

可以使用stat結構體中的成員的st_mode來判斷文件的類型,者需要使用到<sys/stat.h>頭文件中提供的一系列宏:
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);

如果執行成功則返回0,否則返回-1。第一個參數為所要進行測試的文件的名字,第二個參數為測試的權限,它的選擇有:
R_OK 測試讀許可權
W_OK 測試寫許可權
X_OK 測試執行許可權
F_OK 測試文件是否存在

mode可以是上面的幾個參數按位或的結果。需要注意的是access函數只測試進程的實際ID,而不測試進程的有效ID。一定要注意這一點,否則這可能會在某些情況下給我們造成困惑。

unix環境高級編程第三版pdf、

???? 相信在linux下面使用過umask命令的朋友們,都對umask函數的作用一定也了解。umask函數的作用就是在進程執行時,調整umask的值,給進程創建的文件設置合適的權限,當該進程結束時,umask仍保持原來系統中的值不變。它的函數原型如下:

mode_t umask(mode_t cmask);

它的返回值是原來的umask的值,這也是linux系統中少數幾個沒有出錯返回值的幾個函數之一。它的作用是從創建文件時指定的權限中減掉umask中指定的權限。比如,進程創建文件時指定的用戶權限是:

rwxrwxrwx

而且umask指定的值是022,則改進程創建的文件的權限就是755。

???? chmod和fchmod函數用來改變文件的權限,它們的函數原型如下:

int chmod(const char* pathname,mode_t mode);
int fchmod(int filedes,mode_t mode);

chmod在文件名上操作,而fchmod在文件描述符上進行操作。第二個參數用來指定文件要修改的權限,它是下面幾個參數的按位或:
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

用戶在使用進程修改當前文件的權限時,進程的有效用戶ID必須等于文件的所有者,或者是0即超級用戶。

???? 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。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/183630.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息