系統級I O中的共享檔案

2021-09-29 20:27:06 字數 3398 閱讀 5284

接下來展示一些示例:

首先一些有用的標頭檔案放出來:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

接下來是一些需要自建的函式:

//error函式

void

unix_error

(char

*msg)

//fork函式

pit_t fork

(void

)//wait函式

pid_t wait

(int

*status)

//waitpid函式

pid_t waitpid

(pid_t pid,

int*iptr,

int options)

//open函式

intopen

(const

char

*pathname,

int flags, mode_t mode)

//read函式

ssize_t read

(int fd,

void

*buf, size_t count)

//write函式

ssize_t write

(int fd,

const

void

*buf, size_t count)

//close函式

void

close

(int fd)

//dup2函式

intdup2

(int fd1,

int fd2)

(真的要吐槽一下這個部落格,就因為乙個文字編輯器,搞得我只能一行一行地複製**?)

咳咳。。。接下來開始舉例子:

首先先寫乙個小文字foobar.txt

內容就敲foobar六個字母

然後開始敲**:

示例1:

int

main()

好的我看出來了滿滿的套路,那麼不出意外,它的結果是這樣的:

這個時候這張圖就有用了:

(請忽略我那潦草得不能再潦草的字謝謝。。。)

這個圖所展示的就是典型的開啟檔案的核心資料結構。在這個示例中,兩個描述符引用同乙個檔案。沒有共享。(要我說就相當於雙胞胎,複製貼上,各管各的。。。)

示例2:(好我又要努力敲**了。。。)

int

main()

wait

(null);

read

(fd,

&c,1);

printf

("c=%c\n"

,c);

exit(0

);

好的相信你也看出來了這又是乙個滿滿的套路,結局應該也不出你所料:

這個時候我又可以搬出一張差不多的原理圖:

是的這張圖呢就展示了子程序如何繼承父程序的開啟檔案。(

初始狀態是上一張圖哦。)(那麼呢我的理解就是。。。父親為了等等兒子走了跟兒子一樣的老路。。。邏輯好像。。)其實這個**很多彎的,四個函式放在一起非常容易亂套,但其實就是兒子把第乙個字母拿走了,父親來了就只能拿第二個了嘻嘻?

示例3:(這裡使用了重定向

int

main()

結果是啥?你猜

是的我又要放圖了:

意思就是檔案4把檔案1覆蓋了,檔案1在這個函式啟動後就是檔案4本4。所以上面的函式就是讀了兩次檔案fd2,so輸出為o。

哦對了,有一些巨集集體放在這裡解釋一下:

o_rdonly:唯讀。

o_wronly:只寫。

o_rdwr:可讀可寫。

接下裡做一些擴充套件練習吧:

擴充套件訓練1:

int

main

(int argc,

char

*ar**)

如果你看懂了之前的**,這裡也就很簡單了

(後面的txt檔案是需要和**放在乙個目錄下面要讀取的檔案,內容與檔案同名)

擴充套件訓練2:

int

main

(int argc,

char

*ar**)

else

return0;

}

這個跟之前不一樣的是多了乙個sleep函式,手動睡眠了一小會哈哈

擴充套件訓練3:

int

main

(int argc,

char

*ar**)

現在把它跑一下:然後再看看文件(懶得再貼圖了,直接把文件內容附上:)

pqrswxyznef

以及函式的最後乙個引數,訪問許可權位

s_irusr:使用者(擁有者)能夠讀這個檔案。

s_iwusr:使用者(擁有者)能夠寫這個檔案。

以及dup函式的字面解釋:

dup用來複製引數oldfd所指的檔案描述符。當複製成功時,返回最小的尚未被使用過的檔案描述符,若有錯誤則返回-1.錯誤**存入errno中返回的新檔案描述符和引數oldfd指向同乙個檔案,這兩個描述符共享同乙個資料結構,共享所有的鎖定,讀寫指標和各項全現或標誌位。

這裡有點麻煩,以我的語言功底沒辦法說清楚,,以我的理解就是,在使用這個函式之後,fd2的檔案描述符為4。但是在給fd2這個檔案寫「wxyz」時,覆蓋了之前寫的「jklmn」,但由於之前是五個位元組,所以n保留了,然後結果就是這個亞子。。。

說不出為啥,但我覺得我肯定有地方理解錯了,,如果可以的話希望大神們幫忙解釋解釋。。謝謝??

系統級I O學習筆記 檔案的開啟 關閉以及共享

在了解檔案之前,我們顯然需要對本文討論的檔案所屬的範疇,即unix i o有乙個大致的了解。人們描述linux系統中時,往往伴隨著一句話 一切皆檔案 乙個linux 檔案就是乙個m個位元組的序列 b0,b1,bk,bm 1 所有的i 裝置 例如網路 磁碟和終端 都被模型化為檔案,而所有的輸人和輸出都...

Linux Unix中系統級IO

linux unix i o 將裝置對映為檔案的方式,允許unix 核心引出乙個簡單 低階的應用介面。linux unix io的系統呼叫函式很簡單,它只有5個函式 open 開啟 close 關閉 read 讀 write 寫 lseek 定位 但是系統io呼叫開銷比較大,一般不會直接呼叫,而是通...

系統io(檔案io)

檔案描述符 檔案描述符 已開啟檔案的標誌,是非負整形數,當前可以最小作為新檔案的檔案描述符,預設範圍0 1024 可更改 檔案開啟 int open const char pathname,int flags,mode t mode 1.pathname 要開啟檔案的路徑 2.flags 開啟方式 ...