人的記憶力會(huì)隨著歲月的流逝而衰退,寫作可以彌補(bǔ)記憶的不足,將曾經(jīng)的人生經(jīng)歷和感悟記錄下來,也便于保存一份美好的回憶。相信許多人會(huì)覺得范文很難寫?以下是小編為大家收集的優(yōu)秀范文,歡迎大家分享閱讀。
linux的文件系統(tǒng)結(jié)構(gòu) linux的文件系統(tǒng)采用階層結(jié)構(gòu)篇一
對(duì)內(nèi)核而言,所以打開的文件都通過文件描述符引用。每個(gè)進(jìn)程都有一些與之關(guān)聯(lián)的文件描述符。文件描述符是一個(gè)非負(fù)整數(shù)。當(dāng)打開一個(gè)現(xiàn)有文件或創(chuàng)建一個(gè)新文件時(shí),內(nèi)核向進(jìn)程返回一個(gè)文件描述符。當(dāng)讀或?qū)懸粋€(gè)文件時(shí),使用open或creat返回的文件描述符標(biāo)識(shí)該文件,將其作為參數(shù)傳送給read和write。
一般有三個(gè)以及打開的文件描述符,他們是:
0:標(biāo)準(zhǔn)輸入 stdin_fileno
1:標(biāo)準(zhǔn)輸出 stdout_fileno
2標(biāo)準(zhǔn)錯(cuò)誤輸出 stderr_fileno
每行后面的符號(hào)常量是依從posix而定的。
open函數(shù)
#include
#include
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags,mode_t mode);
pathname是要打開或創(chuàng)建文件的名字。
flag用來定義打開文件所采取的的動(dòng)作,必須調(diào)用以下模式之一
o_rdonly, o_wronly, o_rdwr分別代表只讀,只寫,讀寫方式打開。
open還可以包括以下可選模式的組合
o_append:把寫入數(shù)據(jù)追加到文件的尾端
o_creat:若文件不存在,則創(chuàng)建它。使用此選項(xiàng)時(shí),需要第三個(gè)參數(shù)mode,用其指定該新文件的訪問權(quán)限。
o_excl:如果同時(shí)指定了o_creat,而文件存在,則會(huì)出錯(cuò)。用此可以測(cè)試一個(gè)文件是否存在,如果存在,則創(chuàng)建文件,這使測(cè)試和創(chuàng)建兩者成為一個(gè)原子操作。
o_trunc: 如果此文件存在,而且為只寫或讀寫成功打開,則將其長(zhǎng)度截為0。
open返回的文件描述符一定是最小的未用描述符數(shù)值。這一點(diǎn)被某些應(yīng)用程序用在標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤輸出上。如,一個(gè)程序關(guān)閉了自己的標(biāo)準(zhǔn)輸出,然后再次調(diào)用open,文件描述符1就會(huì)被調(diào)用,并且標(biāo)準(zhǔn)輸出將被有效的重定向到另一個(gè)文件或設(shè)備。
posix規(guī)范還標(biāo)準(zhǔn)化了一個(gè)creat調(diào)用,此函數(shù)等效于
open(pathname,o_wonly |o_creat | o_trunc, mode);
close函數(shù)
#include
int close(int fd);
close調(diào)用終止一個(gè)文件描述符fd與對(duì)應(yīng)文件之間的關(guān)聯(lián)。文件描述符被釋放后并能重新使用。close調(diào)用成功返回0,出錯(cuò)返回-1.
關(guān)閉一個(gè)文件時(shí)會(huì)釋放該進(jìn)程加在文件上的所有記錄鎖。當(dāng)一個(gè)進(jìn)程終止時(shí),內(nèi)核自動(dòng)關(guān)閉它所有打開的文件。
lseek函數(shù)
每個(gè)打開的文件都有一個(gè)與其相關(guān)聯(lián)的”當(dāng)前文件偏移量”。按系統(tǒng)默認(rèn)情況,當(dāng)打開一個(gè)文件時(shí),除非指定o_append選項(xiàng),否則該偏移量被設(shè)置為0。lseek可以為一個(gè)打開的文件設(shè)置偏移量。
#include
#include
off_t lseek(int fd, off_t offset, intwhence);
offset用來指定位置,whence參數(shù)定義該偏移值的用法。whence可取以下值:
seek_set: the offset is set to offset bytes.
seek_cur: the offset is set to its current locationplus offset bytes.
seek_end: the offset is set to the size of the fileplus offset bytes.
成功調(diào)用返回從文件頭到文件指針被設(shè)置處的字節(jié)偏移值,失敗返回-1。參數(shù)offset定義在中。
當(dāng)偏移量大于文件長(zhǎng)度時(shí),出現(xiàn)空洞,空洞不占用存儲(chǔ)區(qū)。
read函數(shù)
#include
ssize_t read(int fd, void *buf, size_tcount);
將與文件描述符fd關(guān)聯(lián)的文件中讀入count個(gè)字符放到buf中。返回讀入的字節(jié)數(shù),它可能小于請(qǐng)求的字節(jié)數(shù)。如果read調(diào)用返回0,就表示未讀入任何數(shù)據(jù),已到達(dá)了文件尾。返回-1,就表示出錯(cuò)。
write函數(shù)
#include
ssize_t write(int fd, const void *buf,size_t count);
把緩沖區(qū)buf的前count個(gè)字節(jié)寫入與文件描述符fd相關(guān)聯(lián)的文件中。返回實(shí)際寫入的字節(jié)數(shù),通常與count值相同;否則表示出錯(cuò)。出錯(cuò)的一個(gè)常見原因是:磁盤已寫滿,或者超出了一個(gè)給定進(jìn)程的文件長(zhǎng)度限制。
實(shí)例:創(chuàng)建一個(gè)文件,寫入數(shù)據(jù),移動(dòng)當(dāng)前偏移量,在讀數(shù)據(jù)。
#include//必須最早出現(xiàn),因?yàn)樗赡軙?huì)影響到其他頭文件。#include
#include
#include
#include
int main()
char* filename = ".//file";
char buf[100];
char buf1[5];
int fd;
printf("open a file to writen");
if((fd = open(filename,o_rdwr|o_creat|o_trunc,s_irusr|s_iwusr|s_irgrp|s_iroth ))==-1)
perror("cannot open filen");
return 1;
printf("open file successfully!n");
printf("input a string:");
gets(buf);
//write intofile
if(write(fd,buf,strlen(buf)) !=strlen(buf))
perror("cannot write intofilen");
return 1;
close(fd);
printf("open file to read.n");
if((fd=open(filename,o_rdonly)) == -1)
perror("cannot open thefile.n");
return 1;
if(lseek(fd,3,seek_set) == -1)
perror("lseek erroen");
return 1;
//read from the file
if(read(fd,buf1,4)==-1)
perror("read error.n");
return 1;
printf("read from file is%sn",buf1);
close(fd);
return 0;
執(zhí)行與輸出結(jié)果:
root@:~$gcc -o io io.c
root@:~$./io
open a file towrite
open filesuccessfully!
input a string:akxivbaslzkncxcasbxbwwvaidxbd
open file toread.
read from fileis ivba