stat, fstst, lstat - get file status
目前創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、商丘網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
1. stat, fstat和lstat
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
-
- int stat(const char *path, struct stat *buf);
- int fstat(int fd, struct stat *buf);
- int lstat(const char *path, struct stat *buf);
stat() stats the file pointed to by path and fills in buf.
lstat() is identical to stat(), except that if path is a sym‐
bolic link, then the link itself is stat-ed, not the file that
it refers to.
fstat() is identical to stat(), except that the file to be
stat-ed is specified by the file descriptor fd.
- struct stat {
- dev_t st_dev; /* ID of device containing file */
- ino_t st_ino; /* inode number */
- mode_t st_mode; /* protection */
- nlink_t st_nlink; /* number of hard links */
- uid_t st_uid; /* user ID of owner */
- gid_t st_gid; /* group ID of owner */
- dev_t st_rdev; /* device ID (if special file) */
- off_t st_size; /* total size, in bytes.used for regular file or symbolic link */
- blksize_t st_blksize; /* blocksize for file system I/O */
- blkcnt_t st_blocks; /* number of 512B blocks allocated */
- time_t st_atime; /* time of last access */
- time_t st_mtime; /* time of last modification */
- time_t st_ctime; /* time of last status change */
- };
2.文件類型:可以由sys/stat.h中相應(yīng)宏判斷。這些宏基本都是mode和S_IFxx相&得到結(jié)果。
(1).普通文件:內(nèi)核并不區(qū)分文本文件還是二進(jìn)制文件。對(duì)普通文件的解釋由處理該文件的應(yīng)用程序進(jìn)行。由S_ISREG()宏來判斷。
(2).目錄文件:只有內(nèi)核才能寫目錄文件。由S_ISDIR()宏來判斷。
(3).塊特殊文件:提供對(duì)帶緩沖的設(shè)備的訪問。每次訪問以固定長(zhǎng)度的單位進(jìn)行。由S_ISCHR()宏來判斷。
(4).字特殊文件:提供對(duì)不帶緩沖的設(shè)備的訪問。每次訪問長(zhǎng)度可變。系統(tǒng)中只有這兩種設(shè)備類型。由S_ISBLK()宏來判斷。
(5).FIFO:這種類型文件用于進(jìn)程間通信,有時(shí)候也稱為命名管道。由S_ISFIFO()宏來判斷。
(6).嵌套字socket:這種文件類型用于進(jìn)程鍵的網(wǎng)絡(luò)通信。也可以用于一臺(tái)host上進(jìn)程之間的非網(wǎng)絡(luò)通信。由S_ISSOCK()宏來判斷。
(7).符號(hào)鏈接:這種文件類型指向另一個(gè)文件。由S_ISLNK()宏來判斷。
POSIX.1允許實(shí)現(xiàn)IPC對(duì)象表示為文件,同樣可以由宏來判斷S_TYPEPEISMQ()消息隊(duì)列,S_TYPEISSEM信號(hào)量和S_TYPEISSHM()共享存儲(chǔ)。
3. 文件訪問權(quán)限
stat中的st_uid和st_gid:實(shí)際用戶ID和實(shí)際組ID標(biāo)識(shí)文件究竟屬于誰。有效用戶ID以及附加組ID決定了我們的文件訪問呢權(quán)限。通常兩者相等,但在文件模式字中設(shè)置一個(gè)特殊標(biāo)志:當(dāng)執(zhí)行此文件時(shí),其進(jìn)程的有效用戶ID設(shè)置為文件所有者的ID(st_uid)。與此類似,設(shè)置另一個(gè)特殊標(biāo)志:當(dāng)執(zhí)行此文件時(shí),其進(jìn)程的有效用戶組ID設(shè)置為文件所有者組的ID(st_gid)。
例如/etc/passwd,/etc/shadow文件所有者是root,只有root才對(duì)/etc/passwd,/etc/shadow有寫權(quán)限。而passwd允許任何一個(gè)用戶改變自己的密碼。因此需要設(shè)置passwd的setuid位以保證執(zhí)行該程序的進(jìn)程有root權(quán)限區(qū)更改相關(guān)文件。
規(guī)則:
(1).open with O_TRUNC必須對(duì)文件有寫權(quán)限。
(2).創(chuàng)建一個(gè)文件必須對(duì)所在目錄有寫和執(zhí)行權(quán)限,同樣刪除一個(gè)文件必須對(duì)文件的目錄有寫和執(zhí)行權(quán)限(不需要對(duì)該文件有寫和執(zhí)行權(quán)限)。
(3).如果對(duì)該文件使用任意exec函數(shù),必須對(duì)該文件有執(zhí)行權(quán)限外還要保證該文件是一個(gè)普通文件。
每次打開,創(chuàng)建和刪除一個(gè)文件,內(nèi)核就進(jìn)行文件訪問權(quán)限的測(cè)試,而這種測(cè)試可能涉及文件的所有者,有效ID(有效用戶和有效組ID)以及附加組ID(如果支持的話)。內(nèi)核測(cè)試的順序是:
a).如果進(jìn)程有效用戶ID是0,則允許所有權(quán)限。
b).若進(jìn)程的有效用戶ID等于文件的所有者ID,那么根據(jù)文件所有者的訪問權(quán)限來判斷。
c).若進(jìn)程的有效組ID或進(jìn)程的附加組ID之一等于文件的組ID,那么根據(jù)文件所有者組的訪問權(quán)限來判斷。
d).最后根據(jù)其他用戶的適當(dāng)訪問權(quán)限判斷。
對(duì)于其中任意一步滿足(無論權(quán)限允許還是拒絕),那么不進(jìn)行下面的測(cè)試。
創(chuàng)建新文件:新文件的用戶ID設(shè)置為進(jìn)程的有效用戶ID,而組ID可以為以下二者之一:新文件的組ID可以是進(jìn)程的有效組ID或?yàn)樗谀夸浀慕MID。(Linux ext2/3可以在mount的時(shí)候設(shè)置)
4.umask, access, chmod, fchmod, chown, fchown, lchown系統(tǒng)調(diào)用:略。注:在linux中只有root才能使用chown指令更改用戶ID,但是組ID可以更改為進(jìn)程的有效組ID(前提是當(dāng)前進(jìn)程擁有此文件)。
5.sticky bit:如果一個(gè)可執(zhí)行文件的這一位被設(shè)置了,那么該程序第一次執(zhí)行并結(jié)束時(shí),其程序的正文部分(機(jī)器指令部分)的一個(gè)副本仍被保存在交換區(qū),使得下次執(zhí)行該程序時(shí)能較快地將其裝入內(nèi)存區(qū)。交換區(qū)占用連續(xù)磁盤空間,可將它視為連續(xù)文件。而且一個(gè)程序的正文部分在交換區(qū)也是連續(xù)存放的,相比一般的UNIX文件系統(tǒng),文件的各數(shù)據(jù)塊是隨機(jī)存放的。所以對(duì)于常用的應(yīng)用程序常常設(shè)置它們所在文件的sticky bit。但是對(duì)于UNIX系統(tǒng)大多數(shù)都配置有虛擬存儲(chǔ)系統(tǒng)和快速文件系統(tǒng)不再需要這種技術(shù)。
對(duì)目錄設(shè)置sticky bit,則只有對(duì)該目錄具有寫權(quán)限的用戶在滿足下列條件之一的情況下才能刪除和更名目錄下的文件:擁有此文件,擁有此目錄或是超級(jí)用戶。目錄/tmp和/var/spool/uucppublic是設(shè)置sticky bit的典型候選者,任何用戶都可在這兩個(gè)目錄中創(chuàng)建文件。任一用戶對(duì)這兩個(gè)目錄的權(quán)限通常都是讀寫執(zhí)行兼具。但是用戶不能刪除或者更名屬于其他人的文件,為此這兩個(gè)目錄的文件模式都設(shè)置了sticky bit。
Reference documentation:
Linux Programmer's Manual STAT(2)
APUE
網(wǎng)站名稱:UNIX文件的信息
URL分享:http://muchs.cn/article14/pjjcge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、Google、微信小程序、響應(yīng)式網(wǎng)站、小程序開發(fā)、網(wǎng)站導(dǎo)航
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)