unix檔案系統及I O操作

2021-06-27 12:13:16 字數 3455 閱讀 2808

一 unix 檔案系統

1.1unix檔案屬性

1.1.1 檔案型別

1)普通檔案

最常用的檔案型別,這種檔案包含了某種形式的資料。

2)目錄檔案

這種檔案包含了其他檔案的名字以及指向與這些檔案有關資訊的指標。

3)塊特殊檔案和字元特殊檔案

都是提供對裝置的訪問,乙個帶緩衝定長乙個不帶緩衝不定長。

4)fifo

也稱管道提供程序間的通訊。

5)套接字

6)符號鏈結

這種型別的檔案指向另乙個檔案。

1.1.2 stat結構體

struct stat ;

1.2檔案系統結構

unix把乙個磁碟分為乙個或者多個分割槽,每個分割槽包含乙個檔案系統。i節點是固定記錄項,它包含有關檔案的大部分資訊。

i節點和資料塊:每乙個i節點都有乙個鏈結計數,其值是指向該i節點的目錄項數。i節點包含了檔案相關的資訊,有檔案型別,檔案訪問許可權位,檔案長度和指向檔案資料塊的指標。

核心用三種資料結構開啟檔案

1)每個程序在程序表項中都有乙個記錄項,其包含一張開啟的檔案描述符表,包含了檔案描述符標誌和乙個指向檔案表項的指標。

2)核心為所有開啟檔案維持一張檔案表,包含檔案狀態標誌(讀,寫,添寫,同步,非阻塞等),當前檔案偏移量和指向該檔案v節點表項的指標。概念上v節點和i節點是相同的。

3)每個開啟檔案或裝置都有乙個v節點結構。

二 相關i/o操作

2.1 不帶緩衝的i/o(不帶緩衝指的是每個read或者write都呼叫核心中的乙個系統呼叫)

1)int open(const char *path, int oflags,mode_t mode);

open

建立了一條到檔案或裝置的訪問路徑。open函式一般用於開啟或者建立檔案,在開啟或建立檔案時可以制定檔案的屬性及使用者的許可權等各種引數。

第乙個引數

path表示:路徑名或者檔名。路徑名為絕對路徑名

(如c:/cpp/a.cpp

),檔案則是在當前工作目錄下的。第二個引數

oflags表示:開啟檔案所採取的動作。

可能值:必須指定下面某一種:

o_rdonly(唯讀),

o_wronly(只寫),

o_rdwr(可讀可寫)

開啟/建立檔案時,至少得使用上述三個常量中的乙個,以下常量是選用的:

o_creat        如果指定檔案不存在,則建立這個檔案

o_excl         如果要建立的檔案已存在,則返回 -1,並且修改errno的值

o_trunc        如果檔案存在,並且以只寫/讀寫方式開啟,則清空檔案全部內容

o_noctty       如果路徑名指向終端裝置,不要把這個裝置用作控制終端。

o_nonblock     如果路徑名指向 fifo/塊檔案/字元檔案,則把檔案的開啟和後繼 i/o

設定為非阻塞模式(nonblocking mode)

第三個引數mode表示:(注:第三個引數是在第二個引數中有

o_creat時才用作用。若沒有,則第三個引數可以忽略)設定檔案訪問許可權的初始值。(與使用者掩碼umask變數有關,實際的訪問許可權有mode &~umask確定)

s_irusr,s_iwusr,s_ixusr,s_irgrp,s_iwgrp,s_ixgrp,s_iroth,s_iwoth,s_ixoth.其中r:讀,w:寫,x:執行,usr:檔案所屬的使用者,grp:檔案所屬的組,oth:其他使用者。

返回值:如果操作成功,它將返回乙個檔案描述符,如果失敗,返回-1

2)off_t  lseek(int fildes,  off_t  offset,  int  whence)

seek_set            引數offset即為新的讀寫位置

seek_cur            當前讀寫位置後增加offset個位移量。

seek_end            將讀寫位置指向檔案尾後再增加offset個位移量

返回值:當呼叫成功時則返回目前的讀寫位置,也就是距離檔案開頭多少個字元。若有錯誤則返回-1, errno會存放錯誤**。

3)

ssize_t read(int fd, void *buf, size_t count);

read從引數fd指定的檔案中讀取資料到大小為count的快取buf中,然後返回讀取的實際讀取到的位元組數。

4)

int write(int fd,const void *buf,int count);

write函式向引數fd指定的檔案從快取buf中拿出count個位元組到檔案中。返回值為實際寫入的位元組數。

2.2帶緩衝的i/o

2.2.1 緩衝區的概念及型別

概念:暫時放置輸入或輸出資料的記憶體區域。(臨時儲存區)

全緩衝:填滿標準i/o緩衝區後才進行實際i/o操作

行緩衝:當輸入輸出遇到換行符時標準i/o庫執行i/o操作

不帶緩衝:標準i/o庫不對字元進行緩衝儲存。(標準錯誤流通常是不帶緩衝的)

ios c的緩衝特徵:1,當且僅當標準輸入和標準輸出不指向互動式裝置時他們才是全緩衝的。2,標準錯誤絕不是全緩衝的。

2.2.2 流和file物件

流的概念:流既是資料的源或目的地的抽象,也是源和目的地之間流動資訊的表示

file物件:是乙個結構,它包含了i/o庫為管理該流所需要的所有資訊

file * f

open

(const char * path,const char * type)

fopen 開啟路徑為path的乙個指定檔案。type引數指定對該i/o流的讀寫方式。

返回值:

檔案順利開啟後,指向該流的

檔案指標

就會被返回。如果

檔案開啟失敗則返回

null

,並把錯誤**

存在errno 中。

UNIX檔案系統概述

unix檔案系統是unix系統的心臟部分,提供了層次結構的目錄和檔案。檔案系統將磁碟空間劃分為每1024個位元組一組,稱為塊 block 也有用512位元組為一塊的,如 sco xenix 編號從0到整個磁碟的最大塊數。全部塊可劃分為四個部分,塊0稱為引導塊,檔案系統不用該塊 塊1稱為專用塊,專用塊...

Linux檔案系統I O

作為一名c 後台開發程式設計師,在這個領域需要不斷的學習進步,才能夠穩定前行。對於畢業工作了一年的我,在著期間,對於linux系統可以說是很少接觸,因為現在的專案主要是windows專案。但是,個人認為,作為後台開發工程師,linux系統的學習是必須的,最起碼要熟悉linux系統。而對於幾乎沒接觸過...

unix檔案系統 鏈結與檔案

說明 以下是在讀小駱駝書 perl 語言入門 第十二章 目錄操作 中 鏈結與檔案 一節 p189 193 中的讀書筆記。目錄是一種由系統管理的特殊檔案,它基本上是乙份列表。每份檔案都會儲存在乙個編好號的inode裡,我們可以把它想象成磁碟上的門牌號碼。ls l命令,硬鏈結的數量會顯示在許可權標記的右...