第六章 高階I O函式

2021-08-18 17:32:52 字數 3157 閱讀 6513

1、write()

函式定義:ssize_t write (int fd, const void * buf, size_t count); 

函式說明:write()會把引數buf所指的記憶體寫入count個位元組到引數放到所指的檔案內。

返回值:如果順利write()會返回實際寫入的位元組數。當有錯誤發生時則返回-1,錯誤**存入errno中。

2、read()

函式定義:ssize_t read(int fd, void * buf, size_t count);

函式說明:r

ead()會把引數fd

所指的檔案傳送count 個位元組到buf 指標所指的記憶體中。

返回值:返回值為實際讀取到的位元組數, 如果返回0, 表示已到達檔案尾或是無可讀取的資料。若引數count 為0, 則read()不會有作用並返回0。

注意:read時fd中的資料如果小於要讀取的資料,就會引起阻塞。

read的用法比write較為簡單,此處不敘述過多。由於筆者水平也有限,如果文中有謬誤之處還懇請諸位指出,以免誤導大家。

1、c語言中fstat、stat和lstat 區別----

2、linux:檔案和目錄之stat、fstat和lstat函式!!?----

stat系統呼叫系列包括了fstat、stat和lstat,它們都是用來返回「相關檔案狀態資訊」的,三者的不同之處在於設定原始檔的方式不同。

1

首先隆重介紹的是乙個非常重要的」vip」人物,他是fstat, stat和lstat三者都要用到的乙個結構體型別,名字叫做struct stat。可以說,沒有這個struct stat的支援,上述三個系統呼叫將寸步難行。

這個struct stat結構體在不同的unix/linux系統中的定義是有小的區別的,但你完全不用擔心,這並不會影響我們的使用。

在struct stat結構體中我們常用的且各個平台都一定有的域是:

st_mode 檔案許可權和檔案型別資訊 (記住這個黑體橘紅色)

st_ino   與該檔案關聯的inode

st_dev   儲存檔案的裝置

st_uid   檔案屬主的uid號

st_gid   檔案屬主的gid號

st_atime 檔案上一次被訪問的時間

st_ctime 檔案的許可權、屬主、組或內容上一次被修改的時間

st_mtime 檔案的內容上一次被修改的時間。(和st_ctime的不同之處顯而易見)

st_nlink  該檔案上硬連線的個數

我分別提取了solaris(unix)和fedora(linux)的struct stat結構體的原始定義:大家可以自己比對一下便可以發現兩者確實有所不同,但主要的域是完全相同的。

solaris的struct stat定義:

struct stat ;

fedora的struct stat定義:

struct stat

;2

大家一定注意到了,在上面列舉域的時候,我在st_mode處使用了黑體橘紅色標識,原因在於這個域不像其他域那麼容易使用,其他的域的值顯而易見,而st_mode域是需要一些巨集予以配合才能使用的。其實,通俗說,這些巨集就是一些特定位置為1的二進位制數的外號,我們使用它們和st_mode進行」&」操作,從而就可以得到某些特定的資訊。

檔案型別標誌包括:

s_ifblk:檔案是乙個特殊的塊裝置

s_ifdir:檔案是乙個目錄

s_ifchr:檔案是乙個特殊的字元裝置

s_ififo:檔案是乙個fifo裝置

s_ifreg:檔案是乙個普通檔案(reg即使regular啦)

s_iflnk:檔案是乙個符號鏈結

其他模式標誌包括:

s_isuid:檔案設定了suid位

s_isgid:檔案設定了sgid位

s_isvtx:檔案設定了sticky位

用於解釋st_mode標誌的掩碼包括:

s_ifmt:檔案型別

s_irwxu:屬主的讀/寫/執行許可權,可以分成s_ixusr, s_irusr, s_iwusr

s_irwxg:屬組的讀/寫/執行許可權,可以分成s_ixgrp, s_irgrp, s_iwgrp

s_irwxo:其他使用者的讀/寫/執行許可權,可以分為s_ixoth, s_iroth, s_iwoth

還有一些用於幫助確定檔案型別的巨集定義,這些和上面的巨集不一樣,這些是帶有引數的巨集,類似與函式的使用方法:

s_isblk:測試是否是特殊的塊裝置檔案

s_ischr:測試是否是特殊的字元裝置檔案

s_isdir:測試是否是目錄(我估計find . -type d的源**實現中就用到了這個巨集)

s_isfifo:測試是否是fifo裝置

s_isreg:測試是否是普通檔案

s_islnk:測試是否是符號鏈結

s_issock:測試是否是socket

3

我們已經學習完了struct stat和各種st_mode相關巨集,現在就可以拿它們和stat系統呼叫相互配合工作了!

int fstat(int filedes, struct stat *buf);

int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

聰明人一眼就能看出來fstat的第乙個引數是和另外兩個不一樣的,對!fstat區別於另外兩個系統呼叫的地方在於,fstat系統呼叫接受的是 乙個「檔案描述符」,而另外兩個則直接接受「檔案全路徑」。檔案描述符是需要我們用open系統呼叫後才能得到的,而檔案全路經直接寫就可以了。

stat和lstat的區別:當檔案是乙個符號鏈結時,lstat返回的是該符號鏈結本身的資訊;而stat返回的是該鏈結指向的檔案的資訊。(似乎有些暈吧,這樣記,lstat比stat多了乙個l,因此它是有本事處理符號鏈結檔案的,因此當遇到符號鏈結檔案時,lstat當然不會放過。而 stat系統呼叫沒有這個本事,它只能對符號鏈結檔案睜乙隻眼閉乙隻眼,直接去處理鏈結所指檔案嘍)

第六章函式

第六章 函式 重要知識點 1 函式定義的語法形式 資料型別 函式名 形式參數列 關於函式的定義有如下說明。函式的資料型別是函式的返回值型別 若資料型別為void,則無返回值 函式名是識別符號,乙個程式中除了主函式名必須為main外,其餘函式的名字按照識別符號的取名規則可以任意選取。形式引數 簡稱形參...

第六章 函式

示例 使用函式列印菱形 include intprint star int main intprint star int i,j for i 0 i 4 i 定義無參函式 函式名後面的括號中是空的,沒有任何引數,定義無參函式的一般形式為 型別名 函式名 或 型別名 函式名 void 函式體包括宣告部...

c 第六章函式

基礎知識總結 一 函式定義 c 程式的典型結構 第1部分 預處理指令 符號常量定義 函式宣告 第2部分 主函式 第2部分 函式定義 函式定義的形式 資料型別 函式名 形式參數列 函式體 執行語句 注 1 資料型別是函式的返回值型別,若資料型別為void,則無返回值。2 形式參數列可以是空的 即無參函...