LINUX環(huán)境高級編程-第二講文件_第1頁
LINUX環(huán)境高級編程-第二講文件_第2頁
LINUX環(huán)境高級編程-第二講文件_第3頁
LINUX環(huán)境高級編程-第二講文件_第4頁
LINUX環(huán)境高級編程-第二講文件_第5頁
已閱讀5頁,還剩250頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Linux環(huán)境高級編程第二講

文件的操作第二講

文件的操作文件I/O(第三章)文件和目錄(第四章)第二講

文件的操作文件I/O(第三章)文件和目錄(第四章)文件I/O文件的基本操作(打開、定位、讀寫、關(guān)閉)I/O效率文件共享其他重要I/O函數(shù)文件I/O文件的基本操作(打開、定位、讀寫、關(guān)閉)I/O效率文件共享其他重要I/O函數(shù)文件操作基本順序打開 open創(chuàng)建

creat定位

lseek讀 read寫 write關(guān)閉 closeopen函數(shù)用于打開或者創(chuàng)建一個(gè)文件函數(shù)原型#include<fcntl.h>int

open(constchar*pathname,int

oflag,...)參數(shù)第一個(gè)參數(shù)pathname:要打開或者創(chuàng)建的文件名第二個(gè)參數(shù)oflag:用于指定文件打開模式、標(biāo)志等信息。open函數(shù)第二個(gè)參數(shù)oflag:Linux頭文件已經(jīng)為文件打開模式、標(biāo)志等定義了若干的宏oflag需要指定這些宏宏定義在/usr/include/bits/fcntl.h中在該頭文件中,只讀打開標(biāo)志被定義為:#defineO_RDONLY 00open函數(shù)oflag:文件打開模式標(biāo)志

以下三個(gè)標(biāo)志必須指定一個(gè)且只能指定一個(gè)O_RDONLY : 只讀打開O_WRONLY : 只寫打開O_RDWR : 讀寫打開其他文件標(biāo)志

下面的標(biāo)志是可以選擇的,可通過C語言的或運(yùn)算與文件打開標(biāo)志進(jìn)行組合open函數(shù)oflag其他文件標(biāo)志:

O_APPEND:每次寫的數(shù)據(jù)都添加到文件尾

O_TRUNC:若此文件存在,并以讀寫或只寫打開,則文件長度為0

O_CREAT:若文件不存在,則創(chuàng)建該文件。此時(shí),open函數(shù)需要第三個(gè)參數(shù),用于指定該文件的訪問權(quán)限位(后面描述)

O_EXCL:若同時(shí)指定了O_CREAT標(biāo)志,而文件已經(jīng)存在,則會出錯(cuò)??捎糜跍y試文件是否存在open函數(shù)返回值int

open(constchar*pathname,int

oflag,…)返回值:整型數(shù)據(jù)成功時(shí),返回文件描述符出錯(cuò)時(shí),返回-1open函數(shù)返回值int

open(constchar*pathname,int

oflag,…)返回值:整型數(shù)據(jù)成功時(shí),返回文件描述符出錯(cuò)時(shí),返回-1什么是文件描述符?open函數(shù)返回值int

open(constchar*pathname,int

oflag,…)返回值:整型數(shù)據(jù)成功時(shí),返回文件描述符出錯(cuò)時(shí),返回-1什么是文件描述符?已打開文件的索引open函數(shù)返回值int

open(constchar*pathname,int

oflag,…)返回值:整型數(shù)據(jù)成功時(shí),返回文件描述符出錯(cuò)時(shí),返回-1什么是文件描述符?已打開文件的索引通過索引找到已打開文件文件描述符文件描述符的本質(zhì)是什么?通過文件描述符怎么樣能找到需訪問的文件?需要了解進(jìn)程打開文件時(shí),內(nèi)核創(chuàng)建或涉及到的一系列數(shù)據(jù)結(jié)構(gòu)進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentryd_inode索引節(jié)點(diǎn)號文件各信息inode..............進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........進(jìn)程控制塊PCB進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.........struct

task_struct{.............

struct

files_struct*files;.............};進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files...................files_structfiles_struct該結(jié)構(gòu)體包含了:進(jìn)程已打開文件表進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]files_struct..............structfile**fd;進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfile..............文件對象:代表一個(gè)已打開的文件進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志..............文件偏移量各種文件標(biāo)志文件相關(guān)目錄項(xiàng)struct

dentry*f_dentry;進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentry..............進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentryd_inode..............struct

inode*d_inode;進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentryd_inode索引節(jié)點(diǎn)號文件各信息inode..............索引節(jié)點(diǎn)文件系統(tǒng)索引節(jié)點(diǎn)的信息,存儲在磁盤上當(dāng)需要時(shí),調(diào)入內(nèi)存,填寫VFS的索引節(jié)點(diǎn)(即inode結(jié)構(gòu))每個(gè)文件都對應(yīng)了一個(gè)索引節(jié)點(diǎn)通過索引節(jié)點(diǎn)號,可以唯一的標(biāo)識文件系統(tǒng)中的指定文件索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

索引節(jié)點(diǎn)號索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

文件類型訪問權(quán)限索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

文件擁有者ID索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

文件擁有者所在組ID索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

文件大小索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

文件最后訪問時(shí)間索引節(jié)點(diǎn)struct

inode{........................unsignedlongi_no;

umode_t

i_mode;

uid_t

i_uid;

gid_t

i_gid;

off_t

i_size;

time_t

i_atime;

time_t

i_mtime;};

文件最后修改時(shí)間進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentryd_inode索引節(jié)點(diǎn)號文件各信息inode文件描述符task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentryd_inode索引節(jié)點(diǎn)號文件各信息inodeopen函數(shù)返回的文件描述符已打開文件表的索引文件描述符文件描述符是已打開文件的索引,通過該值可以在fd_array表中檢索相應(yīng)的文件對象文件描述符是一個(gè)非負(fù)的整數(shù)文件描述符0、1、2分別對應(yīng)于標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)出錯(cuò),在進(jìn)程創(chuàng)建時(shí),已經(jīng)打開。Open函數(shù)(續(xù))Open函數(shù)在內(nèi)核完成的工作:39Namei40程序演示

open函數(shù)出錯(cuò)處理(2.1)errno.h頭文件中,定義了errno:當(dāng)API調(diào)用出錯(cuò)時(shí),errno說明出錯(cuò)的具體原因可簡單地將errno理解成整型數(shù)據(jù)出錯(cuò)信息轉(zhuǎn)換成可讀字符串#include<string.h>

char*strerror(int

errno);程序演示

open函數(shù)出錯(cuò)處理以前的定義:extern

int

errno;多線程環(huán)境:

externint*__errno_location();

#defineerrno

(*__errno_location())perror函數(shù)perror函數(shù)根據(jù)當(dāng)前的errno,輸出一條出錯(cuò)信息函數(shù)原型#include<stdio.h>voidperror(constchar*msg);該函數(shù)輸出:msg指向的字符串:errno對應(yīng)的出錯(cuò)信息43文件操作基本順序打開 open創(chuàng)建

creat定位

lseek讀 read寫 write關(guān)閉 closecreat

函數(shù)用于創(chuàng)建一個(gè)新文件函數(shù)原型

int

creat(constchar*pathname,mode_tmode)參數(shù)pathname:要創(chuàng)建的文件名(包括路徑信息)mode:同open的第三個(gè)參數(shù),討論文件的訪問權(quán)限位時(shí)分析返回值成功返回只寫打開的文件描述符出錯(cuò)返回-1creat函數(shù)creat函數(shù)的功能可以用open函數(shù)實(shí)現(xiàn)

open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);為什么需要指定O_TRUNC標(biāo)志當(dāng)文件存在時(shí),調(diào)用creat函數(shù),會將文件的大小變?yōu)?(程序演示2.2)creat函數(shù)creat函數(shù)缺點(diǎn):它以只寫方式打開所創(chuàng)建的文件。若要創(chuàng)建一個(gè)臨時(shí)文件,并先寫該文件,然后又讀該文件,則必須先調(diào)用creat,close,然后再open。簡便方法:

open(pathname,O_RDWR|O_CREAT|O_TRUNC,mode);文件操作基本順序打開 open創(chuàng)建

creat定位

lseek讀 read寫 write關(guān)閉 closelseek函數(shù)lseek函數(shù)用于修改當(dāng)前文件偏移量當(dāng)前文件偏移量的作用規(guī)定了從文件什么地方開始進(jìn)行讀、寫操作通常,讀、寫操作結(jié)束時(shí),會使文件偏移量增加讀寫的字節(jié)數(shù)當(dāng)打開一個(gè)文件時(shí),除非指定了O_APPEND標(biāo)志,否則偏移量被設(shè)置為0lseek函數(shù)函數(shù)原型:off_t

lseek(int

filedes,off_toffset,intwhence)參數(shù)第一個(gè)參數(shù)filedes:open/creat函數(shù)返回的文件描述符第二個(gè)參數(shù)offset:相對偏移量:需結(jié)合whence才能計(jì)算出真正的偏移量類型off_t:通常情況下是32位數(shù)據(jù)類型lseek函數(shù)參數(shù)第三個(gè)參數(shù)Whence:該參數(shù)取值是三個(gè)常量之一SEEK_SET:當(dāng)前文件偏移量為:

距文件開始處的offset個(gè)字節(jié)SEEK_CUR:當(dāng)前文件偏移量為:

當(dāng)前文件偏移量+offset(可正可負(fù))SEEK_END:當(dāng)前文件偏移量為:

當(dāng)前文件長度+offset(可正可負(fù))lseek函數(shù)返回值:若成功,返回新的文件偏移量若出錯(cuò),返回-1獲得當(dāng)前的偏移量off_t

CurrentPosition;CurrentPosition=lseek(fd,0,SEEK_CUR);lseek操作并不引起任何I/O操作,只是修改內(nèi)核中的記錄進(jìn)程打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentryd_inode索引節(jié)點(diǎn)號文件各信息inode空洞文件使用lseek修改文件偏移量后,當(dāng)前文件偏移量有可能大于文件的長度在這種情況下,對該文件的下一次寫操作,將加長該文件這樣文件中形成了一個(gè)空洞。對空洞區(qū)域進(jìn)行讀,均返回00100150200lseek(fd,50,SEEK_END)write(fd,buf,50)文件長度是多少?200?150?空洞文件演示程序(2.3)#od

file.hole文件操作基本順序打開 open創(chuàng)建

creat定位

lseek讀 read寫 write關(guān)閉 closeread函數(shù)用于從文件中讀出數(shù)據(jù)函數(shù)原型

ssize_t

read(int

fd,void*buff,

size_t

nbytes)參數(shù)第一個(gè)參數(shù)fd:文件描述符第二個(gè)參數(shù)buff:指向緩沖區(qū),用于存放從文件讀出的數(shù)據(jù)第三個(gè)參數(shù)nbytes:unsigned

int;需要從文件中讀出的字節(jié)數(shù)緩沖區(qū)的大小>=nbytesread函數(shù)返回值返回值類型:ssize_t,即int出錯(cuò):返回-1成功:返回從文件中實(shí)際讀到的字節(jié)數(shù)當(dāng)讀到文件結(jié)尾時(shí),則返回0read函數(shù)很多情況下,read實(shí)際讀出的字節(jié)數(shù)都小于要求讀出的字節(jié)數(shù)讀普通文件,在讀到要求的字節(jié)數(shù)之前,就到達(dá)了文件尾端當(dāng)從終端設(shè)備讀時(shí),通常一次最多讀一行當(dāng)從網(wǎng)絡(luò)讀時(shí),網(wǎng)絡(luò)中的緩沖機(jī)構(gòu)可能造成read函數(shù)返回值小于所要求讀出的字節(jié)數(shù)某些面向記錄的設(shè)備,如磁帶,一次最多返回一個(gè)記錄........................Read算法60文件操作基本順序打開 open創(chuàng)建

creat定位

lseek讀 read寫 write關(guān)閉 closewrite函數(shù)用于向文件里面,寫入數(shù)據(jù)函數(shù)原型ssize_t

write(int

fd,constvoid*buff,

size_t

nbytes);參數(shù)第一個(gè)參數(shù)fd:文件描述符第二個(gè)參數(shù)buff:指向緩沖區(qū),存放了需要寫入文件的數(shù)據(jù)第三個(gè)參數(shù)nbytes:需要寫入文件的字節(jié)數(shù)write函數(shù)返回值返回值類型:ssize_t,即int出錯(cuò):返回-1成功:返回實(shí)際寫入文件的字節(jié)數(shù)write出錯(cuò)的原因磁盤滿沒有訪問權(quán)限超過了給定進(jìn)程的文件長度限制.....................write函數(shù)當(dāng)從文件中間某處寫入數(shù)據(jù)時(shí),是插入操作?覆蓋操作?還是不能寫?(程序演示2.4)當(dāng)以O(shè)_APPEND選項(xiàng)打開一個(gè)文件時(shí),能否使用lseek指定文件偏移量?指定之后,從文件什么地方開始進(jìn)行寫?讀操作又是如何?(程序演示2.5)文件操作基本順序打開 open創(chuàng)建

creat定位

lseek讀 read寫 write關(guān)閉 closeclose函數(shù)用于關(guān)閉一個(gè)已打開的文件函數(shù)原型int

close(int

filedes)返回值成功返回0出錯(cuò)返回-1參數(shù)filedes:文件描述符close函數(shù)當(dāng)clsoe函數(shù)關(guān)閉文件時(shí),會釋放進(jìn)程加在該文件上的所有記錄鎖內(nèi)核會對進(jìn)程打開文件表、文件對象、索引節(jié)點(diǎn)表項(xiàng)等結(jié)構(gòu)進(jìn)行修改,釋放相關(guān)的資源當(dāng)進(jìn)程退出時(shí),會關(guān)閉當(dāng)前所有已打開的文件描述符文件操作基本順序打開 open創(chuàng)建

creat定位

lseek讀 read寫 write關(guān)閉 close文件I/O文件的基本操作(打開、定位、讀寫、關(guān)閉)I/O效率文件共享其他重要I/O函數(shù)I/O效率程序3-3#defineBUFFSIZE4096intmain(){

intn;charbuf[BUFFSIZE];

while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)

if(write(STDOUT_FILENO,buf,n)!=n)

err_sys(“writeerror”);return0;}從標(biāo)準(zhǔn)輸入讀數(shù)據(jù)然后寫至標(biāo)準(zhǔn)輸出對標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出進(jìn)行了重定向:$./test<file1>/dev/null從文件file1讀數(shù)據(jù)然后寫至設(shè)備/dev/null程序中,影響效率的關(guān)鍵:BUFFSIZE的取值I/O效率BUFFSIZE的取值系統(tǒng)CPU時(shí)間I/O效率原因Linux文件系統(tǒng)采用了某種預(yù)讀技術(shù)當(dāng)檢測到正在進(jìn)行順序讀取時(shí),系統(tǒng)就試圖讀入比應(yīng)用程序所要求的更多數(shù)據(jù)并假設(shè)應(yīng)用程序很快就會讀這些數(shù)據(jù)當(dāng)BUFFSIZE增加到一定程度后,預(yù)讀就停止了文件I/O文件的基本操作(打開、定位、讀寫、關(guān)閉)I/O效率文件共享其他重要I/O函數(shù)打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志............dentryd_inode索引節(jié)點(diǎn)號文件各信息inode打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inode文件共享進(jìn)程之間的文件共享進(jìn)程內(nèi)的文件共享兩個(gè)獨(dú)立進(jìn)程各自打開同一個(gè)文件task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inodetask_struct.........files.......................files_structfd[0]fd[1]................fd[4]...........files_structfilef_posf_dentry文件標(biāo)志進(jìn)程A進(jìn)程B兩個(gè)獨(dú)立進(jìn)程各自打開同一個(gè)文件每個(gè)進(jìn)程都有自己的當(dāng)前文件偏移量在完成每個(gè)write后,當(dāng)前文件偏移量即增加所寫的字節(jié)數(shù)如果用O_APPEND標(biāo)志打開了一個(gè)文件,則該標(biāo)志存儲在file結(jié)構(gòu)體中。每次執(zhí)行寫操作時(shí),當(dāng)前偏移量首先被設(shè)置為文件長度不同進(jìn)程共享文件對象task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inodetask_struct.........files.......................files_structfd[0]fd[1]................fd[4]files_struct進(jìn)程A進(jìn)程B進(jìn)程A進(jìn)程B共享了文件偏移量存在競爭進(jìn)程內(nèi)共享文件task_struct.........files.......................files_structfd[0]fd[1]fd[2]fd[3]...........files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inode造成的原因,通常是調(diào)用了dup或dup2函數(shù)dup函數(shù)用于復(fù)制一個(gè)已經(jīng)存在的文件描述符函數(shù)原型int

dup(int

filedes);返回值成功返回新的文件描述符出錯(cuò)返回-1參數(shù)filedes:文件描述符dup函數(shù)的作用task_struct.........files.......................files_structfd[0]fd[1]fd[2].........................files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inode調(diào)用dup函數(shù)之前int

fd=dup(1);fd[3]當(dāng)前未占用文件描述符中的最小值dup函數(shù)的作用task_struct.........files.......................files_structfd[0]fd[1]fd[2].........................files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inodefd[3]使新老文件描述符,都指向同一個(gè)文件對象dup2函數(shù)用于復(fù)制一個(gè)已經(jīng)存在的文件描述符函數(shù)原型intdup2(intfiledes,intfiledes2);dup和dup2的區(qū)別dup返回的新文件描述符一定是當(dāng)前可用描述符中的最小值dup2則將文件描述符復(fù)制到指定位置,即將filedes復(fù)制到filedes2如果filedes2已經(jīng)打開,dup2則先將其關(guān)閉;若filedes2等于filedes,則直接返回filedes,而不關(guān)閉dup與dup2的區(qū)別假設(shè)進(jìn)程已打開文件描述符0、1、2調(diào)用dup2(1,6),dup2返回值是多少?然后再調(diào)用dup(6),dup返回值是多少?程序演示驗(yàn)證(2.6)dup函數(shù)的作用task_struct.........files.......................files_structfd[0]fd[1]fd[2].........................files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inode...............fd[6]dup函數(shù)的作用task_struct.........files.......................files_structfd[0]fd[1]fd[2].........................files_structfilef_posf_dentry文件標(biāo)志索引節(jié)點(diǎn)號文件各信息inodefd[3]..............fd[6]文件I/O文件的基本操作(打開、定位、讀寫、關(guān)閉)I/O效率文件共享其他重要I/O函數(shù)其他重要的I/O函數(shù)sync、fsync、fdatasync函數(shù)fcntl函數(shù)ioctl函數(shù)sync/fsync/fdatasync函數(shù)通常Linux實(shí)現(xiàn)在內(nèi)核中設(shè)有緩沖區(qū)高速緩存或頁面高速緩存大多數(shù)的磁盤I/O都通過緩沖區(qū)進(jìn)行當(dāng)將數(shù)據(jù)寫入文件時(shí),內(nèi)核通常先將數(shù)據(jù)復(fù)制到某一個(gè)緩沖區(qū)中如果該緩沖區(qū)滿或者內(nèi)核需要重用該緩沖區(qū),則將該緩沖排入到輸出隊(duì)列等到其達(dá)到隊(duì)首時(shí),才進(jìn)行實(shí)際的磁盤讀寫操作延遲寫sync/fsync/fdatasync函數(shù)磁盤文件系統(tǒng)高速緩存應(yīng)用程序用戶模式內(nèi)核模式sync/fsync/fdatasync函數(shù)延遲寫優(yōu)點(diǎn)減少了磁盤讀寫次數(shù)延遲寫缺點(diǎn)降低了文件內(nèi)容的更新速度當(dāng)系統(tǒng)發(fā)生故障,高速緩沖區(qū)中的內(nèi)容可能丟失解決辦法對緩沖區(qū)進(jìn)行清理,希望將數(shù)據(jù)寫入到磁盤sync、fsync、fdatasync起到了刷緩存的作用sync函數(shù)sync原型:voidsync();將所有修改過的緩沖區(qū)排入寫隊(duì)列,然后就返回并不等待實(shí)際的寫磁盤操作結(jié)束sync函數(shù)針對的是所有修改過的緩沖區(qū),并不僅僅針對某個(gè)被修改過的文件通常稱為update的系統(tǒng)守護(hù)進(jìn)程會周期性地調(diào)用sync函數(shù),即保證定期沖洗內(nèi)核緩沖區(qū)fsync函數(shù)函數(shù)原型:

int

fsync(int

filedes);參數(shù)與返回值:filedes:文件描述符返回值:成功返回0,出錯(cuò)返回-1fsync函數(shù)只對文件描述符filedes指定的單一文件起作用并且等待寫磁盤操作結(jié)束后才返回fdatasync函數(shù)函數(shù)原型

int

fdatasync(int

filedes);參數(shù)與返回值filedes:文件描述符返回值:成功返回0,出錯(cuò)返回-1fdatasync和fsync類似,但它只影響文件的數(shù)據(jù)部分;而fync不僅影響文件的數(shù)據(jù),還同步更新文件的屬性。對比syncfsyncfdatasync是否等待寫否是是是否更新數(shù)據(jù)否是是是否更新屬性否是否其他重要的I/O函數(shù)sync、fsync、fdatasync函數(shù)fcntl函數(shù)ioctl函數(shù)fcntl函數(shù)用于改變已經(jīng)打開文件的性質(zhì)函數(shù)原型int

fcntl(int

filedes,int

cmd,.../*int

arg*/);返回值成功時(shí),返回值依賴于第二個(gè)參數(shù)cmd出錯(cuò)時(shí),返回-1參數(shù)第一個(gè)參數(shù)filedes:已打開文件的文件描述符fcntl函數(shù)第二個(gè)參數(shù)cmd的五種取值方式:復(fù)制一個(gè)現(xiàn)存的描述符(cmd=F_DUPFD)獲得/設(shè)置文件描述符標(biāo)記(cmd=F_GETFD或F_SETFD)獲得/設(shè)置文件狀態(tài)標(biāo)志(cmd=F_GETFL或F_SETFL)獲得/設(shè)置異步I/O信號接收進(jìn)程(cmd=F_GETOWN或F_SETOWN)獲得/設(shè)置記錄鎖(cmd=F_GETLK,F_SETLK或F_SETLKW)cmd五種取值方式F_DUPFD復(fù)制文件描述符filedes,與dup(2)類似fcntl返回新文件描述符新描述符是尚未打開的各描述符中,大于或等于第三個(gè)參數(shù)值中,各值的最小值例子:假設(shè)文件描述符0、1、2被占用,

fcntl(1,F_DUPFD,5)返回什么???

fcntl(2,F_DUPFD,1)返回什么???與dup、dup2的異同fcntl函數(shù)與dup、dup2函數(shù)均用于復(fù)制文件描述符,即使不同的文件描述符指向同一個(gè)文件對象dup(filedes)等價(jià)于

fcntl(filedes,F_DUPFD,0);dup2(filedes,filedes2)不完全等價(jià)于close(filedes2);

fcntl(filedes,F_DUPFD,filedes2);與dup、dup2的異同fcntl與dup2不完全等價(jià)dup2是一個(gè)原子操作,而close與fcntl則包括兩個(gè)函數(shù)調(diào)用。在close和fcntl之間可能被信號打斷dup2與fcntl之間有某些不同的errnocmd五種取值方式F_DUPFDF_GETFD將文件描述符filedes對應(yīng)的標(biāo)志,作為返回值返回。當(dāng)前只定義了一個(gè)文件描述符標(biāo)志FD_CLOEXECF_SETFD設(shè)置文件描述符filedes對應(yīng)的標(biāo)志。新標(biāo)志按照第三個(gè)參數(shù)設(shè)置。cmd五種取值方式F_GETFLfcntl函數(shù)返回文件描述符filedes對應(yīng)的文件狀態(tài)標(biāo)志文件狀態(tài)標(biāo)志包括:O_RDONLYO_WRONLYO_RDWRO_APPENDO_NONBLOCK 非阻塞方式O_SYNC 等待寫方式O_ASYNC 異步方式(僅4.3+BSD)cmd五種取值方式F_SETFL將fcntl函數(shù)的第三個(gè)參數(shù),設(shè)置為文件狀態(tài)標(biāo)志可以更改的標(biāo)志包括:O_APPEND、O_NONBLOCK、O_SYNC、O_ASYNCF_GETOWN獲取當(dāng)前接收SIGIO和SIGURG信號的進(jìn)程ID或進(jìn)程組IDcmd五種取值方式F_SETOWN設(shè)置接收SIGIO和SIGURG信號的進(jìn)程ID或進(jìn)程組ID第三個(gè)參數(shù)arg:arg>0時(shí),表示一個(gè)進(jìn)程IDarg<0時(shí),其絕對值表示一個(gè)進(jìn)程組IDfcntl函數(shù)--實(shí)例1(2.7)實(shí)例1:獲取文件狀態(tài)標(biāo)志代碼演示

int

fd=open(.......);

int

val=fcntl(fd,F_GETFL);

int

accmode=val&O_ACCMODE;O_ACCMODE=30......0011O_RDONLY=0O_WRONLY=1O_RDWR=2對應(yīng)的是最低的兩位bit取val最低的兩位即獲取了文件打開模式fcntl函數(shù)--實(shí)例1對于非打開模式標(biāo)志:

if(val&O_APPEND){//文件狀態(tài)標(biāo)志中包括O_APPEND}O_APPEND=1024第11個(gè)bit為1,其余為0.即第11位對應(yīng)了O_APPEND標(biāo)志取val第11位查看是否為1fcntl函數(shù)--實(shí)例2實(shí)例2:添加或刪除某個(gè)文件狀態(tài)標(biāo)志添加或刪除某個(gè)文件描述符標(biāo)志或文件狀態(tài)標(biāo)志時(shí),先將現(xiàn)有標(biāo)志值存放在某個(gè)變量中,再對該變量進(jìn)行修改,最后將該變量設(shè)置為新的標(biāo)志。不能只是執(zhí)行F_SETFD或F_SETFL命令,這樣會關(guān)閉以前設(shè)置的標(biāo)志位。fcntl函數(shù)--實(shí)例2代碼:voidset_fl(int

fd,intflags){

int

val;if((val=fcntl(fd,F_GETFL,0))<0)

err_sys("fcntlF_GETFLerror");

val |= flags;if(fcntl(fd,F_SETFL,val)<0)

err_sys("fcntlF_SETFLerror");}若清除某標(biāo)志:val&=~flags;其他重要的I/O函數(shù)sync、fsync、fdatasync函數(shù)fcntl函數(shù)ioctl函數(shù)ioctl函數(shù)I/O操作的雜物箱其實(shí)現(xiàn)的功能往往和具體的設(shè)備有關(guān)系設(shè)備可以自定義自己的ioctl命令操作系統(tǒng)提供了通用的ioctl命令ioctl類似于windows的DeviceIoControl函數(shù)第三章文件I/O小節(jié)文件的基本操作(打開、定位、讀寫、關(guān)閉)I/O效率文件共享其他重要I/O函數(shù)第二講

文件的操作文件I/O(第三章)文件和目錄(第四章)文件和目錄ext2文件系統(tǒng)在磁盤的組織stat、fstat、lstat函數(shù)文件的基本性質(zhì)修改文件屬性的函數(shù)硬鏈接與符號鏈接目錄操作文件和目錄ext2文件系統(tǒng)在磁盤的組織stat、fstat、lstat函數(shù)文件的基本性質(zhì)修改文件屬性的函數(shù)硬鏈接與符號鏈接目錄操作ext2文件系統(tǒng)在磁盤上的組織ext2文件系統(tǒng)是Linux土生土長的文件系統(tǒng)ext2是ext(ExtendedFileSystem)的完善,因此,ext2為TheSecondExtendedFileSystemext2文件系統(tǒng)加上日志支持,即ext3ext2和ext3在磁盤上的布局大致相同,只是ext3多出了一個(gè)特殊的inode,用于記錄文件系統(tǒng)日志磁盤布局假設(shè)ext2文件系統(tǒng)所占的分區(qū)磁盤布局分區(qū)被劃分成一個(gè)個(gè)的塊block,每個(gè)塊均有編號

同一個(gè)文件系統(tǒng)中,block的大小都是相同的

不同的文件系統(tǒng),block的大小可以不同典型的block大小為1k或者4k塊1.........塊m-1塊m..........塊p塊0磁盤布局分區(qū)被劃分成一個(gè)個(gè)的塊block塊1.........塊m-1塊m..........塊p塊0塊組0塊組1塊組2..........塊組n-1塊組n

若干塊聚集在一起,形成一個(gè)塊組

分區(qū)被劃分成若干個(gè)塊組

每個(gè)塊組所包括的塊個(gè)數(shù)相同磁盤布局分區(qū)被劃分成一個(gè)個(gè)的塊block塊1.........塊m-1塊m..........塊p塊0塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊

每個(gè)塊組都包含有一個(gè)相同的超級塊

超級塊重復(fù)的主要目的:災(zāi)難恢復(fù)

超級塊用于存放文件系統(tǒng)的基本信息磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊s_magic:ext2文件系統(tǒng)標(biāo)識0xef53

s_log_block_size:可由它得出塊大小

塊組包括的塊個(gè)數(shù)、包括的索引節(jié)點(diǎn)個(gè)數(shù),總的塊個(gè)數(shù)磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊

bg_block_bitmap:指向塊位圖

bg_inode_bitmap:指向索引節(jié)點(diǎn)位圖

bg_inode_table:指向索引節(jié)點(diǎn)表磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊當(dāng)某個(gè)bit為1,表示該bit對應(yīng)的數(shù)據(jù)塊被占用

當(dāng)某個(gè)bit為0,表示該bit對應(yīng)的數(shù)據(jù)塊未被占用磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊當(dāng)某個(gè)bit為1,表示該bit對應(yīng)的索引節(jié)點(diǎn)被占用

當(dāng)某個(gè)bit為0,表示該bit對應(yīng)的索引節(jié)點(diǎn)未被占用磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊

索引節(jié)點(diǎn)表由若干個(gè)索引節(jié)點(diǎn)組成

一個(gè)索引節(jié)點(diǎn)對應(yīng)了一個(gè)文件(目錄也是一種文件)每個(gè)索引節(jié)點(diǎn)都有一個(gè)編號,這個(gè)編號是全局的,從1開始計(jì)數(shù)索引節(jié)點(diǎn)包含的信息structext3_inode{__u16i_mode; //Filemode__u16i_uid; //Low16bitsofOwnerUid

__u32i_size; //文件大小__u32i_atime; //Accesstime__u32i_ctime; //Creationtime__u32i_mtime; //Modificationtime__u16i_gid; //Low16bitsofGroupId__u16i_links_count;

//Linkscount__u32i_flags; //Fileflags__u32i_block[EXT3_N_BLOCKS];

//一組block指針,

//存儲了文件的內(nèi)容................................................};目錄目錄也是一種文件通過其索引節(jié)點(diǎn)中的i_block字段,可以找到存放目錄文件內(nèi)容的數(shù)據(jù)塊目錄的內(nèi)容具有固定的格式目錄文件按照固定的格式記錄了目錄包含了哪些文件目錄項(xiàng)目錄中每個(gè)文件,都對應(yīng)了一個(gè)目錄項(xiàng)若干個(gè)目錄項(xiàng)構(gòu)成了目錄文件的內(nèi)容structext3_dir_entry_2{__u32inode;/*Inode

號數(shù)*/__u8file_type;charname[EXT3_NAME_LEN];//Filename..........................};問題如何在ext2文件系統(tǒng)中找到一個(gè)文件?假設(shè)查找文件/root/test假設(shè)/root的索引節(jié)點(diǎn)號已知,為1400磁盤布局超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊s_magic:ext2文件系統(tǒng)標(biāo)識0xef53

s_log_block_size:可由它得出塊大小

塊組包括的塊個(gè)數(shù)、塊組包括的索引節(jié)點(diǎn)個(gè)數(shù),總的塊個(gè)數(shù)s_inodes_per_group1400-13001399商4,余199磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊

bg_block_bitmap:指向塊位圖

bg_inode_bitmap:指向索引節(jié)點(diǎn)位圖

bg_inode_table:指向索引節(jié)點(diǎn)表磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊.........索引節(jié)點(diǎn)1300..........索引節(jié)點(diǎn)1400..........磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊.........索引節(jié)點(diǎn)1300..........索引節(jié)點(diǎn)1400..........塊指針..........磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊.........索引節(jié)點(diǎn)1300..........索引節(jié)點(diǎn)1400..........塊指針...................數(shù)據(jù)塊..........數(shù)據(jù)塊..........磁盤布局塊組0塊組1塊組2..........塊組n-1塊組n超級塊組描述符塊位圖索引節(jié)點(diǎn)位圖索引節(jié)點(diǎn)表數(shù)據(jù)塊.........索引節(jié)點(diǎn)1300..........索引節(jié)點(diǎn)1400..........塊指針...................數(shù)據(jù)塊..........數(shù)據(jù)塊..........索引節(jié)點(diǎn)號2300文件名test....................文件和目錄ext2文件系統(tǒng)在磁盤的組織stat、fstat、lstat函數(shù)文件的基本性質(zhì)修改文件屬性的函數(shù)硬鏈接與符號鏈接目錄操作stat函數(shù)用于獲取有關(guān)文件的信息結(jié)構(gòu)函數(shù)原型

int

stat(constchar*restrictpathname,

structstat*restrict

buf);restrict關(guān)鍵字restrict關(guān)鍵字C99標(biāo)準(zhǔn)引入的只能用于限定指針表明指針是訪問一個(gè)數(shù)據(jù)對象的唯一且初始的方式restrict關(guān)鍵字intar[10];int*restrictrestar=(int*)malloc(10*sizeof(int));int*par=ar;for(intn=0;n<10;n++){

par[n]+=5;

restar[n]+=5;

ar[n]*=2;

par[n]+=3;

restar[n]+=3;}對于malloc分配的這段內(nèi)存只能通過restar訪問int*pnew=restar;restrict關(guān)鍵字intar[10];int*restrictrestar=(int*)malloc(10*sizeof(int));int*par=ar;for(intn=0;n<10;n++){

par[n]+=5;

restar[n]+=5;

ar[n]*=2;

par[n]+=3;

restar[n]+=3;}對于malloc分配的這段內(nèi)存只能通過restar訪問int*pnew=restar;restrict關(guān)鍵字intar[10];int*restrictrestar=(int*)malloc(10*sizeof(int));int*par=ar;for(intn=0;n<10;n++){

par[n]+=5;

restar[n]+=5;

ar[n]*=2;

par[n]+=3;

restar[n]+=3;}對restar的操作進(jìn)行優(yōu)化,restar[n]+=8無法對par的操作優(yōu)化par[n]+=8什么是編譯單元?stat函數(shù)用于獲取有關(guān)文件的信息結(jié)構(gòu)函數(shù)原型int

stat(constchar*restrictpathname,

structstat*restrict

buf);參數(shù)與返回值第一個(gè)參數(shù)pathname:文件名,需要獲取該文件的信息第二個(gè)參數(shù)buf:stat函數(shù)將pathname對應(yīng)的文件信息,填入buf指向的stat結(jié)構(gòu)中返回值:0成功;-1出錯(cuò)stat結(jié)構(gòu)體structstat{.......................................................

ino_t

st_ino; /*inodenumber*/

mode_t

st_mode;/*filetype&mode*/

nlink_t

st_nlink; /*numberofhardlinks*/

uid_t

st_uid; /*userIDofowner*/

gid_t

st_gid; /*groupIDofowner*/

off_t

st_size; /*totalsize,inbytes*/unsignedlong st_blksize; /*blocksize*/unsignedlong st_blocks; /*numberofblocksallocated

time_t

st_atime; /*timeoflastaccess*/

time_t

st_mtime;/*timeoflastmodification*/

time_t

st_ctime; /*timeofinodelastchange};fstat、lstat函數(shù)用于獲取有關(guān)文件的信息結(jié)構(gòu)函數(shù)原型

int

stat(constchar*restrictpathname,

structstat*restrictbuf);

int

fstat(int

filedes,structstat*buf);

int

lstat(constchar*restrictpathname,

structstat*restrictbuf);lstat返回符號鏈接本身的信息stat返回符號鏈接所引用的文件信息fstat、lstat函數(shù)用于獲取有關(guān)文件的信息結(jié)構(gòu)函數(shù)原型

int

stat(constchar*restrictpathname,

structstat*restrictbuf);

int

fstat(int

filedes,structstat*buf);

int

lstat(constchar*restrictpathname,

structstat*restrictbuf);Stat通過文件名返回文件的信息fstat通過文件描述符程序演示演示stat的使用(2.8)文件和目錄ext2文件系統(tǒng)在磁盤的組織stat、fstat、lstat函數(shù)文件的基本性質(zhì)修改文件屬性的函數(shù)硬鏈接與符號鏈接目錄操作文件的基本性質(zhì)文件類型用戶ID和組ID文件訪問權(quán)限新文件和目錄的所有權(quán)文件時(shí)間文件的基本性質(zhì)文件類型用戶ID和組ID文件訪問權(quán)限新文件和目錄的所有權(quán)文件時(shí)間文件類型UNIX或Linux系統(tǒng)中的常見文件類型有:普通文件

目錄文件

字符特殊文件

提供對設(shè)備不帶緩沖的訪問塊特殊文件

提供對設(shè)備帶緩沖的訪問FIFO文件 用于進(jìn)程間的通信,命名管道

套接口文件

用于網(wǎng)絡(luò)通信符號鏈接

使文件指向另一個(gè)文件152stat結(jié)構(gòu)體structstat{.......................................................

ino_t

st_ino; /*inodenumber*/

mode_t

st_mode;/*filetype&mode*/

nlink_t

st_nlink; /*numberofhardlinks*/

uid_t

st_uid; /*userIDofowner*/

gid_t

st_gid; /*groupIDofowner*/

off_t

st_size; /*totalsize,inbytes*/unsignedlong st_blksize; /*blocksize*/unsignedlong st_blocks; /*numberofblocksallocated

time_t

st_atime; /*timeoflastaccess*/

time_t

st_mtime;/*timeoflastmodification*/

time_t

st_ctime; /*timeofinodelastchange};包含了文件類型信息文件類型的判定使用如下的宏,判斷文件類型普通文件 S_ISREG()目錄文件 S_ISDIR()字符特殊文件 S_ISCHR()塊特殊文件 S_ISBLK()FIFO文件 S_ISFIFO()套接口文件 S_ISSOCK()符號連接 S_ISLINK()154文件類型示例代碼:

structstatbuf;lstat(filename,&buf);

if(S_ISDIR(buf.st_mode))

cout<<“directory”<<endl;注意,此處必須用lstat獲取文件信息,而不用stat,為什么?155程序演示文件類型的判定(2.9)156文件的基本性質(zhì)文件類型用戶ID和組ID文件訪問權(quán)限新文件和目錄的所有權(quán)文件時(shí)間用戶ID和組ID第一種ID:Linux是一個(gè)多用戶的操作系統(tǒng)。每個(gè)用戶都有一個(gè)ID,用以唯一標(biāo)識該用戶。這個(gè)ID,被稱為UID。每個(gè)用戶都屬于某一個(gè)組,組也有一個(gè)ID。這個(gè)ID,被稱為組ID,GID。第二種ID:文件所有者相關(guān)文件所有者ID:擁有某文件的用戶的ID文件所有者組ID:擁有某文件的用戶所屬組的IDstat結(jié)構(gòu)體structstat{.......................................................

ino_t

st_ino; /*inodenumber*/

mode_t

st_mode;/*filetype&mode*/

nlink_t

st_nlink; /*numberofhardlinks*/

uid_t

st_uid; /*userIDofowner*/

gid_t

st_gid; /*groupIDofowner*/

off_t

st_size; /*totalsize,inbytes*/unsignedlong st_blksize; /*blocksize*/unsignedlong st_blocks; /*numberofblocksallocated

time_t

st_atime; /*timeoflastaccess*/

time_t

st_mtime;/*timeoflastmodification*/

time_t

st_ctime; /*timeofinodelastchange};用戶ID和組ID第三種ID:實(shí)際用戶ID和實(shí)際組ID進(jìn)程的實(shí)際用戶ID:運(yùn)行該進(jìn)程的用戶的ID進(jìn)程的實(shí)際組ID:運(yùn)行該進(jìn)程的用戶所屬的組ID第四種ID:有效用戶ID和有效組ID進(jìn)程的有效用戶ID:用于文件訪問權(quán)限的檢查進(jìn)程的有效組ID:程序演示(2.10)大多數(shù)情況下有效用戶/組ID=實(shí)際用戶/組ID用戶ID和組ID設(shè)置用戶ID位和設(shè)置組ID位在可執(zhí)行文件的權(quán)限標(biāo)記中,有一個(gè)“設(shè)置用戶ID位”若該位被設(shè)置,表示:執(zhí)行該文件時(shí),進(jìn)程的有效用戶ID變?yōu)槲募乃姓邔τ谠O(shè)置組ID位類似通過命令行設(shè)置用戶ID位(2.11)chmod

u+sfilename

chmod

g+sfilenamechmod

u-sfilename

chmod

g-sfilename用戶ID和組ID第五種ID:保存的設(shè)置用戶ID保存的設(shè)置組ID上述兩者在執(zhí)行一個(gè)程序時(shí)包含了有效用戶ID和有效組ID的副本文件的基本性質(zhì)文件類型用戶ID和組ID文件訪問權(quán)限新文件和目錄的所有權(quán)文件時(shí)間文件訪問權(quán)限什么是文件訪問權(quán)限?為什么要有訪問權(quán)限?每一個(gè)文件都有訪問權(quán)限位,可將其分成三類文件訪問權(quán)限針對文件所有者針對與文件所有者同組的用戶針對非同組的用戶指定所有者是否可讀指定組用戶是否可讀指定其他用戶是否可讀指定所有者是否可寫指定組用戶是否可寫指定其他用戶是否可寫指定所有者是否可執(zhí)行指定組用戶是否可執(zhí)行指定其他用戶是否可執(zhí)行stat結(jié)構(gòu)體structstat{.......................................................

ino_t

st_ino; /*inodenumber*/

mode_t

st_mode;/*filetype&mode*/

nlink_t

st_nlink; /*numberofhardlinks*/

uid_t

st_uid; /*userIDofowner*/

gid_t

st_gid; /*groupIDofowner*/

off_t

st_size; /*totalsize,inbytes*/unsignedlong st_blksize; /*blocksize*/unsignedlong st_blocks; /*numberofblocksallocated

time_t

st_atime; /*timeoflastaccess*/

time_t

st_mtime;/*timeoflastmodification*/

time_t

st_ctime; /*timeofinodelastchange};包含了文件訪問權(quán)限位st_mode字段76543210111098st_mode的低11bitst_mode字段76543210111098st_mode的低11bit針對文件所有者的訪問權(quán)限st_mode字段76543210111098st_mode的低11bit指示文件所有者是否可執(zhí)行指示文件所有者是否可寫指示文件所有者是否可讀st_mode字段76543210111098st_mode的低11bit針對與文件所有者同組的用戶的訪問權(quán)限st_mode字段76543210111098st_mode的低11bit指示組用戶是否可執(zhí)行指示組用戶是否可寫指示組用戶是否可讀st_mode字段76543210111098st_mode的低11bit針對其他用戶的訪問權(quán)限st_mode字段76543210111098st_mode的低11bit指示其他用戶是否可執(zhí)行指示其他用戶是否可寫指示其他用戶是否可讀st_mode字段76543210111098st_mode的低11bit9個(gè)文件訪問權(quán)限位判定文件訪問權(quán)限的屏蔽字(2.13)st_mode屏蔽意義S_IRUSR用戶-讀S_IWUSR用戶-寫S_IXUSR用戶-執(zhí)行S_IRGRP組-讀S_IWGRP組-寫S_IXGRP組-執(zhí)行S_IROTH其他-讀S_IROTH其他-寫S_IWOTH其他-執(zhí)行if(buf.st_mode&S_IRUSR){用戶可讀}open的第三個(gè)參數(shù)creat的第二個(gè)參數(shù)st_mode字段76543210111098st_mode的低11bit9個(gè)文件訪問權(quán)限位設(shè)置用戶ID設(shè)置組ID粘住位文件存取許可權(quán)(續(xù))當(dāng)打開一個(gè)任意類型的文件時(shí),對該文件路徑名中包含的每

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論