溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

UNIX文件的信息

發(fā)布時(shí)間:2020-06-13 14:58:08 來(lái)源:網(wǎng)絡(luò) 閱讀:321 作者:aboocool 欄目:系統(tǒng)運(yùn)維

 stat, fstst, lstat - get file status

 
1. stat, fstat和lstat
 
  1. #include <sys/types.h> 
  2. #include <sys/stat.h> 
  3. #include <unistd.h> 
  4.  
  5. int stat(const char *path, struct stat *buf); 
  6. int fstat(int fd, struct stat *buf); 
  7. 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.
 
        
  1. struct stat { 
  2.             dev_t     st_dev;     /* ID of device containing file */ 
  3.             ino_t     st_ino;     /* inode number */ 
  4.             mode_t    st_mode;    /* protection */ 
  5.             nlink_t   st_nlink;   /* number of hard links */ 
  6.             uid_t     st_uid;     /* user ID of owner */ 
  7.             gid_t     st_gid;     /* group ID of owner */ 
  8.             dev_t     st_rdev;    /* device ID (if special file) */ 
  9.             off_t     st_size;    /* total size, in bytes.used for regular file or symbolic link */ 
  10.             blksize_t st_blksize; /* blocksize for file system I/O */ 
  11.             blkcnt_t  st_blocks;  /* number of 512B blocks allocated */ 
  12.             time_t    st_atime;   /* time of last access */ 
  13.             time_t    st_mtime;   /* time of last modification */ 
  14.             time_t    st_ctime;   /* time of last status change */ 
  15.         }; 
2.文件類型:可以由sys/stat.h中相應(yīng)宏判斷。這些宏基本都是mode和S_IFxx相&得到結(jié)果。
(1).普通文件:內(nèi)核并不區(qū)分文本文件還是二進(jìn)制文件。對(duì)普通文件的解釋由處理該文件的應(yīng)用程序進(jìn)行。由S_ISREG()宏來(lái)判斷。
(2).目錄文件:只有內(nèi)核才能寫(xiě)目錄文件。由S_ISDIR()宏來(lái)判斷。
(3).塊特殊文件:提供對(duì)帶緩沖的設(shè)備的訪問(wèn)。每次訪問(wèn)以固定長(zhǎng)度的單位進(jìn)行。由S_ISCHR()宏來(lái)判斷。
(4).字特殊文件:提供對(duì)不帶緩沖的設(shè)備的訪問(wèn)。每次訪問(wèn)長(zhǎng)度可變。系統(tǒng)中只有這兩種設(shè)備類型。由S_ISBLK()宏來(lái)判斷。
(5).FIFO:這種類型文件用于進(jìn)程間通信,有時(shí)候也稱為命名管道。由S_ISFIFO()宏來(lái)判斷。
(6).嵌套字socket:這種文件類型用于進(jìn)程鍵的網(wǎng)絡(luò)通信。也可以用于一臺(tái)host上進(jìn)程之間的非網(wǎng)絡(luò)通信。由S_ISSOCK()宏來(lái)判斷。
(7).符號(hào)鏈接:這種文件類型指向另一個(gè)文件。由S_ISLNK()宏來(lái)判斷。
POSIX.1允許實(shí)現(xiàn)IPC對(duì)象表示為文件,同樣可以由宏來(lái)判斷S_TYPEPEISMQ()消息隊(duì)列,S_TYPEISSEM信號(hào)量和S_TYPEISSHM()共享存儲(chǔ)。
 
3. 文件訪問(wèn)權(quán)限
stat中的st_uid和st_gid:實(shí)際用戶ID和實(shí)際組ID標(biāo)識(shí)文件究竟屬于誰(shuí)。有效用戶ID以及附加組ID決定了我們的文件訪問(wèn)呢權(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有寫(xiě)權(quán)限。而passwd允許任何一個(gè)用戶改變自己的密碼。因此需要設(shè)置passwd的setuid位以保證執(zhí)行該程序的進(jìn)程有root權(quán)限區(qū)更改相關(guān)文件。
規(guī)則:
(1).open with O_TRUNC必須對(duì)文件有寫(xiě)權(quán)限。
(2).創(chuàng)建一個(gè)文件必須對(duì)所在目錄有寫(xiě)和執(zhí)行權(quán)限,同樣刪除一個(gè)文件必須對(duì)文件的目錄有寫(xiě)和執(zhí)行權(quán)限(不需要對(duì)該文件有寫(xiě)和執(zhí)行權(quán)限)。
(3).如果對(duì)該文件使用任意exec函數(shù),必須對(duì)該文件有執(zhí)行權(quán)限外還要保證該文件是一個(gè)普通文件。
每次打開(kāi),創(chuàng)建和刪除一個(gè)文件,內(nèi)核就進(jìn)行文件訪問(wèn)權(quán)限的測(cè)試,而這種測(cè)試可能涉及文件的所有者,有效ID(有效用戶和有效組ID)以及附加組ID(如果支持的話)。內(nèi)核測(cè)試的順序是:
a).如果進(jìn)程有效用戶ID是0,則允許所有權(quán)限。
b).若進(jìn)程的有效用戶ID等于文件的所有者ID,那么根據(jù)文件所有者的訪問(wèn)權(quán)限來(lái)判斷。
c).若進(jìn)程的有效組ID或進(jìn)程的附加組ID之一等于文件的組ID,那么根據(jù)文件所有者組的訪問(wèn)權(quán)限來(lái)判斷。
d).最后根據(jù)其他用戶的適當(dāng)訪問(wèn)權(quán)限判斷。
對(duì)于其中任意一步滿足(無(wú)論權(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ù)磁盤(pán)空間,可將它視為連續(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ì)該目錄具有寫(xiě)權(quán)限的用戶在滿足下列條件之一的情況下才能刪除和更名目錄下的文件:擁有此文件,擁有此目錄或是超級(jí)用戶。目錄/tmp和/var/spool/uucppublic是設(shè)置sticky bit的典型候選者,任何用戶都可在這兩個(gè)目錄中創(chuàng)建文件。任一用戶對(duì)這兩個(gè)目錄的權(quán)限通常都是讀寫(xiě)執(zhí)行兼具。但是用戶不能刪除或者更名屬于其他人的文件,為此這兩個(gè)目錄的文件模式都設(shè)置了sticky bit。
 
 
Reference documentation:
Linux Programmer's Manual               STAT(2)
APUE
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI