亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Unix > 正文

UNIX高級(jí)環(huán)境編程(3)Files And Directories

2024-06-28 13:21:57
字體:
供稿:網(wǎng)友
UNIX高級(jí)環(huán)境編程(3)Files And Directories - stat函數(shù),文件類型,和各種ID

在前面的兩篇,我們了解了IO操作的一些基本操作函數(shù),包括open、read和write。

在本篇我們來學(xué)習(xí)一下文件系統(tǒng)的其他特性和一個(gè)文件的屬性,涉及的函數(shù)功能包括:

  • 查看文件的所有屬性;
  • 改變文件所有者;
  • 改變文件權(quán)限;
  • 操作文件夾。

我們還會(huì)了解一些文件系統(tǒng)相關(guān)的數(shù)據(jù)結(jié)構(gòu)和符號(hào)鏈接(symbolic link)。

1 函數(shù)stat、fstat、fstatat、lsat函數(shù)
#include <sys/stat.h>int stat(const char *restrict pathname, struct stat *restrict buf );int fstat(int fd, struct stat *buf);int lstat(const char *restrict pathname, struct stat *restrict buf );int fstatat(int fd, const char *restrict pathname, struct stat *restrict buf, int flag);//All four return: 0 if OK, −1 on error

函數(shù)功能:

stat返回pathname指定文件的信息;

fstat獲取在文件描述符fd上打開的文件信息;

lstat的功能和stat函數(shù)類似,只是有一種情況有區(qū)別,當(dāng)pathname指定的文件是一個(gè)符號(hào)鏈接的時(shí)候,lstat函數(shù)獲取的文件信息是該符號(hào)鏈接的信息,而不是符號(hào)鏈接所指向文件的信息,在后面我們會(huì)了解更多關(guān)于符號(hào)鏈接的相關(guān)內(nèi)容;

fstatat:文件描述符fd表示一個(gè)父目錄,pathame指定父目錄下得一個(gè)子目錄,fstatat函數(shù)返回該子目錄下的文件統(tǒng)計(jì)數(shù)。flag用來設(shè)置是否查詢符號(hào)鏈接所指向的文件,如果flag設(shè)置為AT_SYMLINK_NOFOLLOW,則fstatat函數(shù)只返回該符號(hào)鏈接的相關(guān)信息,如果不設(shè)置該標(biāo)志位,則返回該符號(hào)鏈接指向的文件的相關(guān)信息。

是一個(gè)關(guān)鍵的輸出參數(shù),上面的參數(shù)將文件屬性填充值該結(jié)構(gòu)體內(nèi)。結(jié)構(gòu)體如下圖所示:

NewImage

結(jié)構(gòu)體中得每個(gè)成員都代表文件的某一個(gè)屬性,我們會(huì)逐個(gè)了解屬性的具體含義。

2 文件類型(File Type)

目前我們了解了兩種文件:常規(guī)文件(regular files)和文件夾(directory)。

常見的幾種文件類型包括:

  1. 常規(guī)文件(Regular File):包含某種組織形式的數(shù)據(jù)的文件,linux并不關(guān)心數(shù)據(jù)是文本或是二進(jìn)制(有一個(gè)例外,就是二進(jìn)制可執(zhí)行文件,內(nèi)核必須知道該類型的格式才能執(zhí)行),對(duì)數(shù)據(jù)的解析由應(yīng)用程序負(fù)責(zé)。
  2. 目錄文件(Directory):包含其他文件的名字,和指向這些文件信息的指針。進(jìn)程可以讀取目錄文件的內(nèi)容,但是只有內(nèi)核才又寫該類型文件的權(quán)限,進(jìn)程通過調(diào)用本篇介紹的一些函數(shù)才操作修改目錄文件,本質(zhì)上仍然是內(nèi)核修改。
  3. 塊文件(Block Special File):如硬盤驅(qū)動(dòng),提供了固定大小緩存用于IO的文件類型。
  4. 字符文件(Charactor Special File):無緩存的對(duì)可變大小單元進(jìn)行操作的文件類型。操作系統(tǒng)所有的設(shè)備都是塊設(shè)備文件或字符設(shè)備文件。
  5. 先入先出隊(duì)列(FIFO):進(jìn)程間通信使用的文件類型。
  6. 套接字(Socket):網(wǎng)絡(luò)或單機(jī)中的兩個(gè)進(jìn)程之間的通信使用的文件類型。
  7. 符號(hào)鏈接(Symbolic File):指向另一個(gè)文件的文件類型。

stat結(jié)構(gòu)體中得st_mode制定了文件的類型。

Example:

#include "apue.h"intmain(int argc, char *argv[]){    int         i;    struct stat buf;    char        *ptr;     for (i = 1; i < argc; i++) {        PRintf("%s: ", argv[i]);        if (lstat(argv[i], &buf) < 0) {            err_ret("lstat error");            continue;        }        if (S_ISREG(buf.st_mode))            ptr = "regular";        else if (S_ISDIR(buf.st_mode))            ptr = "directory";        else if (S_ISCHR(buf.st_mode))            ptr = "character special";        else if (S_ISBLK(buf.st_mode))            ptr = "block special";        else if (S_ISFIFO(buf.st_mode))            ptr = "fifo";        else if (S_ISLNK(buf.st_mode))            ptr = "symbolic link";        else if (S_ISSOCK(buf.st_mode))            ptr = "socket";        else            ptr = "** unknown mode **";        printf("%s/n", ptr);    }    exit(0);}

運(yùn)行截圖:

NewImage

3 設(shè)置用戶Id(User ID)和組Id(Group ID)

每個(gè)進(jìn)程6個(gè)甚至更多的ID和它關(guān)聯(lián)。如下表所示:

NewImage

簡(jiǎn)要介紹ID的區(qū)別:

  • real user ID和real group ID:當(dāng)前登陸用戶的ID和該用戶所屬的組ID;
  • effective user ID、effective group ID和supplementary group IDs:文件的訪問權(quán)限。
  • saved set-user-ID和saved set-group-ID:當(dāng)一個(gè)程序運(yùn)行時(shí),會(huì)拷貝effective user ID和effective group ID到這兩個(gè)變量中,這兩個(gè)ID和函數(shù)setuid相關(guān)。

一般情況下,effective user ID = real user ID,effective group ID = real group ID.

每個(gè)文件都由一個(gè)所有者,和一個(gè)組所有者,分別對(duì)應(yīng)stat數(shù)據(jù)結(jié)構(gòu)中得字段:st_uid和st_gid。

如果執(zhí)行程序時(shí),希望effective user(group) ID != real user(group) ID,即希望改變進(jìn)程的訪問資源的權(quán)限為文件所有者的訪問權(quán)限,而不是真實(shí)用戶的訪問權(quán)限,可以通過設(shè)置mode中兩個(gè)bit來實(shí)現(xiàn)將effective user(group) ID設(shè)置為文件所有者(組),這兩個(gè)bit叫做:set-user-ID位和set-group-ID位。這兩個(gè)位包含在stat數(shù)據(jù)結(jié)構(gòu)中得st_mode字段中,可以通過函數(shù)S_ISUID和S_ISGID來測(cè)試。

4 文件訪問權(quán)限(File access Permissions)

stat數(shù)據(jù)結(jié)構(gòu)中的st_mode字段中同樣包含文件訪問權(quán)限位。

每個(gè)文件有9中權(quán)限位:

NewImage

這些標(biāo)志位的使用需要注意的事項(xiàng)總結(jié)如下:

  • 如果要打開某個(gè)文件,則該文件全路徑上的所有文件夾都需要有執(zhí)行權(quán)限(execute permission),該文件則需要對(duì)應(yīng)的操作權(quán)限。需要可執(zhí)行權(quán)限的原因是可以通過(pass through)它找到下一級(jí)目錄或者文件;
  • 讀權(quán)限,允許打開某個(gè)已存在文件,標(biāo)志位:O_RDONLY和O_RDWR;
  • 寫權(quán)限,允許向某個(gè)已存在文件寫入數(shù)據(jù),標(biāo)志位:O_WRONLY和O_RDWR;
  • 調(diào)用open函數(shù)時(shí),如果要指定標(biāo)志位O_TRUNC,需要寫權(quán)限;
  • 我們無法在某個(gè)文件夾下創(chuàng)建文件,除非我們對(duì)該文件夾有寫權(quán)限(write permission)和執(zhí)行權(quán)限(execute permission);
  • 刪除某個(gè)文件,需要該文件所在文件夾的寫權(quán)限和執(zhí)行權(quán)限,而不需要對(duì)該文件本身有寫權(quán)限或讀權(quán)限;
  • 如果我們希望使用exec類函數(shù)執(zhí)行某個(gè)文件,則必須有可執(zhí)行權(quán)限,并且該文件必須為regular file。

文件訪問權(quán)限檢測(cè)流程:

  1. 如果進(jìn)程的effective user ID是0,即超級(jí)用戶,則允許訪問;
  2. 如果進(jìn)程的effective user ID是文件所有者的ID,即該進(jìn)程是該文件的所有者(owner),并且相應(yīng)的訪問權(quán)限標(biāo)志位被設(shè)置,則允許訪問;
  3. 如果進(jìn)程的effective group ID或者supplementary group IDs之一是文件所有組的ID,并且相應(yīng)的訪問權(quán)限標(biāo)志位被設(shè)置,則允許訪問;
  4. 如果相應(yīng)的other訪問權(quán)限標(biāo)志位被設(shè)置,則允許訪問。

簡(jiǎn)單來說,如果進(jìn)程是該文件的擁有者,則訪問是否允許取決于用戶訪問權(quán)限標(biāo)志位,忽略組權(quán)限標(biāo)志位;如果進(jìn)程不是該文件的擁有者,但是該進(jìn)程屬于某個(gè)有訪問權(quán)限的組,訪問是否允許取決于組權(quán)限標(biāo)志位的設(shè)置,忽略other訪問權(quán)限標(biāo)志位。

5 新文件和目錄的所有權(quán)(ownership)

新文件的real user ID為創(chuàng)建該文件的進(jìn)程的effective user ID。

新文件的real group ID的取值取決于:

  • 新文件的real group ID可以是常見該文件的進(jìn)程的effective group ID;
  • 新文件的real group ID可以是該文件所在目錄的real group ID。(必須保證該目錄下面的所有文件的real group ID都是該目錄的real group ID)。

6 函數(shù)access和faccessat

access和faccessat函數(shù)用于測(cè)試當(dāng)前用戶(real user,當(dāng)前登錄用戶)對(duì)某一文件是否有某種操作權(quán)限。

函數(shù)聲明:

#include <unistd.h>int access(const char* pathname, int mode);int faccessat(int fd, const char* pathname, int mode, int flag);

mode的可取值,當(dāng)為F_OK,測(cè)試文件是否存在。

NewImage

faccessat函數(shù)的相關(guān)細(xì)節(jié):

  • 當(dāng)pathname為絕對(duì)路徑,或者fd取值為AT_FDCWD并且pathname為相對(duì)路徑時(shí),功能和access相同。
  • 否則,faccessat函數(shù)指定的工作目錄為pathname指定的相對(duì)目錄加上fd描述符指定的父目錄。
  • 當(dāng)flag的值為AT_EACCESS時(shí),測(cè)試時(shí)使用進(jìn)程的effective user和group而不是當(dāng)前real user ID和group。

Example:

#include "apue.h"#include <fcntl.h>intmain(int argc, char *argv[]){    if (argc != 2)        err_quit("usage: a.out <pathname>");    if (access(argv[1], R_OK) < 0)        err_ret("access error for %s", argv[1]);    else        printf("read access OK/n");    if (open(argv[1], O_RDONLY) < 0)        err_ret("open error for %s", argv[1]);    else        printf("open for reading OK/n");    exit(0);}

測(cè)試:

NewImage

由于本地mac環(huán)境搞不定,所以直接截書上的例子吧。

該例中,當(dāng)切換到root用戶,修改了該文件的所有者為root用戶,并且設(shè)置了set-user-ID,這樣當(dāng)切換到別的用戶時(shí),仍可以以RDONLY方式打開文件,但是由于access是測(cè)試當(dāng)前real user的讀權(quán)限,當(dāng)切換到其他用戶時(shí),access測(cè)試不通過,顯示Permission denied。

好吧,直接忽略上面這個(gè)例子吧,我沒能在自己的機(jī)器上重現(xiàn),只是直接隨便翻譯書上某一段話。如果有某位高手看懂了,請(qǐng)指點(diǎn)。

小結(jié)

由于這一章內(nèi)容比較多,所以打算用三篇來寫,這是第一篇,主要介紹了stat函數(shù),access函數(shù),文件類型和各種令人糊涂的ID。

參考資料:

《Advanced Programming in the UNIX Envinronment 3rd》


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产精品久久国产精品| 亚洲中文字幕无码不卡电影| 91久久精品一区二区| 国产一区二区三区免费| 亚洲日韩欧美一区二区在线| 日韩少妇与小伙激情| 欧美日韩成人影院| 国产夫妻在线| 欧美大片欧美激情性色a∨久久| 欧美高清一级片在线观看| 91在线超碰| 在线网址91| 欧美在线视频导航| 日韩小视频网址| 国产9色视频| 成人禁在线观看网站| 91偷拍精品一区二区三区| 三上悠亚免费在线观看| 国产一区 二区 三区一级| 国产尤物久久久| 成人午夜剧场免费观看完整版| 国产成人综合在线| 亚州色图欧美色图| 影音先锋欧美激情| 国产精品一区二区三区www| 日本va欧美va精品| 日韩欧美123区| 中文字幕欧美人与畜| 欧美老熟妇一区二区三区| 影音先锋中文字幕在线观看| 色成人免费网站| 成人久久一区| 鲁一鲁一鲁一鲁一澡| 欧美精品成人网| 日韩久久免费电影| 欧美一区二区三区久久综| 亚洲一区二区日韩| 亚洲欧洲视频| 在线看免费av| 污污视频在线免费观看| 久久综合五月婷婷| 日本高清xxxx| 亚洲av色香蕉一区二区三区| 天天影视欧美综合在线观看| 性欧美疯狂猛交69hd| yy4480电影网| 亚洲最大福利视频网站| 在线播放豆国产99亚洲| 亚洲国产成人精品久久| 日韩电影在线观看中文字幕| 亚洲精品二区三区| 在线观看日韩高清av| 福利视频大全| a天堂中文在线观看| 久久久久88色偷偷| 1769视频在线播放免费观看| 国产成人精品一区二区| 天天综合中文字幕| 三级在线观看免费大全| 激情综合在线观看| 国产一区二区三区四区五区| 琪琪一区二区三区| 蜜桃视频免费网站| 亚洲人成在线一二| 一区二区久久久| 一区二区在线观看av| 国产乱了高清露脸对白| 在线看日韩精品电影| 久久久99精品免费观看不卡| 九色一区二区| 欧美一级生活片| 在线观看欧美日韩国产| 91激情在线观看| 春暖花开亚洲一区二区三区| 久久精品色综合| 免费观看日韩av| 一区二区三区波多野结衣在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产欧美熟妇另类久久久| 欧美1区二区三区公司| 久久福利综合| 97超碰资源站在线观看| 国产乱淫av麻豆国产免费| 大胆国模一区二区三区| 成人免费淫片95视频观看网站| 自拍偷拍欧美一区| 美女黄页在线观看| а√天堂8资源在线官网| 无码精品视频一区二区三区| 久久久久久久久久久久91| 先锋成人影院| 日本少妇全体裸体洗澡| 中文字幕国产免费| 无码国产精品一区二区色情男同| 久久中文字幕一区二区| 免费国产羞羞网站视频| 丰满岳乱妇国产精品一区| 自拍偷拍第八页| 九义人在线观看完整免费版电视剧| 亚洲精品自产拍在线观看| 国产激情av在线| 国产在线精品一区二区三区不卡| www黄色在线| 国产中文字幕免费观看| 狠狠色狠狠色综合人人| 欧美性潮喷xxxxx免费视频看| 欧美三日本三级少妇三99| 国产日韩欧美高清免费| 三妻四妾完整版在线观看电视剧| 国外成人免费在线播放| 羞羞视频网站在线观看| 桃花网日韩影视在线观看视频| 成人同人动漫免费观看| 国产精品欧美日韩久久| 韩国精品视频在线观看| 1024亚洲合集| 美女激情福利视频在线观看| 国产精品色婷婷在线观看| 天堂在线资源网| 全亚洲第一av番号网站| 你懂的好爽在线观看| 欧美婷婷久久| 日本不卡一区二区三区四区| 狠狠色狠狠色综合日日tαg| 无码人妻精品一区二区三区蜜桃91| 国产一区二区三区国产精品| 亚洲丰满少妇videoshd| 狠狠操狠狠色| 亚州色图欧美色图| 午夜激情福利网| 波多野结衣三级在线| 亚洲自拍三区| 久久久精品一品道一区| 日韩精品在线观看免费| 999www成人| 日韩亚洲在线观看| 亚洲欧美在线不卡| 伊人一区二区三区久久精品| 不卡视频免费在线观看| 99热这里只有精品3| 色综合天天综合| 亚洲专区国产精品| 不卡专区在线| 麻豆精品密在线观看| 久热中文字幕在线精品首页| 又黄又爽的网站| 成人在线看片网站| 久久免费播放视频| 水中色av综合| 99v久久综合狠狠综合久久| 99精品热视频只有精品10| 亚洲激情女人| 欧美美女网站色| 91精品国产欧美日韩| 日本视频在线免费观看| 春日野结衣av| 男人的天堂在线视频| 日韩精品一区二区三区第95| 色婷婷综合缴情免费观看| 久久色精品视频| 亚洲欧美精品在线观看| 97久久精品在线| 亚洲免费在线观看av| 国内外激情在线| 欧美午夜在线视频| 疯狂试爱三2浴室激情视频| 久久久久国产精品夜夜夜夜夜| 黄av在线免费观看| 噜噜噜91成人网| 欧美另类极品videosbest视| 国产一级二级三级| 国产精品亚洲综合| 玖玖爱在线观看| 日本电影在线观看| 欧美午夜电影网| 亚洲天堂视频在线| 黄色小视频在线观看| 亚洲性猛交xxxx乱大交| 2020中文字字幕在线不卡| 污污软件在线观看| 邻居大乳一区二区三区| 久久久久无码国产精品| 欧美色成人综合| 奇米777欧美一区二区| 久久精品99北条麻妃| 国产野外战在线播放| 中文字幕在线视频网| 亚洲美女在线看| 动漫h在线观看| 国产乱国产乱老熟300部视频| 亚洲国产成人精品女人| 男操女在线观看| 国产精品羞羞答答在线观看| 成人av一区| 久久精品亚洲a| 欧美wwwwwww| 久久五月婷婷丁香社区| 51调教丨国产调教视频| 欧美成人video| 国内外成人在线| 欧美猛交ⅹxxx乱大交视频| 激情都市亚洲| 香蕉久久夜色| av高清日电影| 亚洲免费观看高清完整| 全国精品久久少妇| 中文字字幕在线中文乱码电影| 精品久久久久人成| 亚洲国产av一区二区三区| 亚洲精品888| 青青青国产在线观看| 亚洲综合网站久久久| 自拍偷拍一区二区三区四区| 欧美jizz18hd性欧美| 国产精品一区二区美女视频免费看| 国产精品久久精品日日| 国产呦萝稀缺另类资源| 99久久综合狠狠综合久久止| 一本大道熟女人妻中文字幕在线| a4yy在线播放免费观看视频| 国产精品白嫩初高中害羞小美女| 久久成人免费日本黄色| 亚洲免费不卡| 涩涩屋成人免费视频软件| 二区视频在线观看| 午夜精品一区二区三区在线观看| 很黄很黄激情成人| 91青青国产在线观看精品| 亚洲国模精品私拍| 国产精品一码二码三码在线| 亚洲午夜激情| 成人免费毛片糖心| 久久久久久一二三区| 日本免费黄色| 在线播放色视频| 欧美国产在线看| 热久久一区二区| 亚州欧美在线| 777久久精品| 不卡一二三区首页| 一级黄色片国产| 91精品国产免费久久综合| 欧美韩国日本一区| 亚洲免费观看高清完整版在线观看熊| 中文字幕视频观看| 成人福利视频在线观看| 日韩网站在线免费观看| 欧美午夜精品久久久久久浪潮| 涩涩视频网站在线观看| 蜜臀va亚洲va欧美va天堂| 可以直接看的av网址站| 免费看黄裸体一级大秀欧美| 国产一区二区免费看| 欧美大黑bbbbbbbbb在线| 肥女人的一级毛片| 国产精品网站大全| 久久久夜色精品| 久久久久综合| 中文字幕av一区 二区| 国产一区二区中文字幕| 欧美日韩国产乱码电影| 国产欧美久久一区二区| 日韩欧美成人一区| 国产在线播放一区二区三区| 美女网站色免费| 一色屋色费精品视频在线看| 九色精品国产蝌蚪| 亚洲精品国产首次亮相| 国产亚洲精品美女久久久m| 亚洲日本欧美日韩高观看| 人妻少妇偷人精品久久久任期| 欧美一卡2卡三卡4卡5免费| 能直接看的av| 国产精品一区二区在线免费观看| 亚洲国产美女| 欧美最猛性xxxxx免费| 国产在线视频在线观看| 久久国产精品久久久久久| 久久porn| 婷婷精品在线观看| 日韩精品第1页| 国产精品免费av一区二区| 国产精品青草久久久久福利99| 午夜一区二区三区| 日韩中文字幕视频网| 日本欧美黄色片| 一区二区三区免费网站| 日本www在线观看视频| 黑人巨大精品欧美一区二区小视频| 欧美xxxxb| 中文字幕乱视频| 91精品国产高清自在线看超| 亚洲午夜激情免费视频| 国产精品亚洲午夜一区二区三区| caoporn成人免费视频在线| 久久精品99| 九色在线观看视频| 国产亚洲女人久久久久毛片| 91caopron| 欧洲一级精品| www.av91| 狠狠色香婷婷久久亚洲精品| 影音先锋久久| 国产午夜精品在线观看| 成人中文视频| 国产激情久久久| 国产精品二区一区二区aⅴ| 电影天堂最新网址| 免费成人你懂的| 欧洲美女精品免费观看视频| 99精品视频在线观看播放| 亚洲国产一区二区在线| 国产精品自拍毛片| 很黄很污的网站| 拍拍拍999自拍偷| 毛片手机在线观看| 在线免费av播放| av在线免费播放网址| 上原亚衣av一区二区三区| 久久久人人爽| xxav国产精品美女主播| 国产精品久久久久久久免费| 小说区图片区亚洲| 欧美精品麻豆| 亚洲激情在线播放| 2021国产视频| 欧美激情国产精品| 精品国产免费久久久久久尖叫|