linux檔案開啟模式

2021-06-22 10:15:19 字數 1862 閱讀 9931



檔案開啟

int open(const char *

pathname

, int 

flags

, mode_t 

mode

);普通方式(canonical mode)

flags中沒有設定o_sync and o_direct。這種方式中read是阻塞呼叫(blocking call),等到磁碟資料讀取完畢後返回;write也是阻塞呼叫,不過write將資料寫入到page cache後,就返回,沒有寫入磁碟的動作。核心會根據一定的策略將page cache中的資料寫回到磁碟。

同步模式(synchronous mode )

設定o_sync。read操作和普通方式一樣,write操作有所不同。write操作等待資料完全寫入磁碟後在返回。該模式下的write操作會有較大的效能降低,但是提高了系統的可靠性,不會產生資料丟失。

direct i/o mode

設定o_direct 。這種方式下,read和write操作不再經過page cache,而是直接讀寫磁碟。有些應用程式需要自己維護快取,可以使用該模式,如資料庫系統。

非阻塞模式(nonblocking i/o)

設定o_nonblock。該模式下,read和write都是非阻塞(nonblocking)模式。如果系統中沒有可用資料,read立刻返回,而不是等待;write也是如此,如果資料不能馬上傳送出去,也立刻返回。

該模式一般要結合某種 i/o event notification機制使用,如select, poll, epoll等。

通過void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)開啟。

非同步模式(asynchronous mode)

posix標準中定義了檔案非同步訪問模式的介面(aio_read,aio_write等)。非同步方式中,read/write將要將所需資訊(如檔案,記憶體位址等)記錄下來,就立刻返回,不需要等待實際io操作。實際io完成後,會有事件通知。這個模式和硬體裝置的dma比較類似,只要發出io指令即可,實際的io操作會在後面非同步完成。

socket的讀和寫

阻塞模式

recv: 阻塞,直到網路緩衝區中有資料收到。

send:如果網路緩衝區有足夠空間,send將資料拷貝到緩衝區後返回;如果沒有足夠空間(如網路擁塞控制,對方沒有確認之前的訊息等),阻塞。

非阻塞模式

recv: 如果網路緩衝區中有資料收到,立刻返回。返回值eagain or ewouldblock。

send

:如果網路緩衝區有足夠空間,send將資料拷貝到緩衝區後返回;如果沒有足夠空間,返回

eagain 

or ewouldblock 。

send操作成功,不代表資料已經傳送到了接收方,只代表資料已經放入網路緩衝區中。

不同的開啟方式有不同的適用場景,在選擇的時候一定要根據實際需求來確定。如支援高併發的web伺服器都會選用非阻塞模式處理socket。

linux最開始只有普通方式,其他的方式一定為了處理各種使用場景而逐漸增加的。當然不排除某位大牛拍腦袋想出來的。

linux檔案開啟模式

檔案開啟 int open const char pathname int flags mode t mode 普通方式 canonical mode flags中沒有設定o sync and o direct。這樣的方式中read是堵塞呼叫 blocking call 等到磁碟資料讀取完成後返回 ...

檔案的開啟模式

1.ofstream 寫資料 ifstream 讀資料 fstream ofstream ifstream 建立fstream物件時,應指定檔案開啟模式 mode 模式 description 描述 ios in 開啟檔案讀資料 ios out 開啟檔案寫資料 ios ate 開啟檔案,把檔案游標移...

檔案開啟模式高階

wt with open 36w.txt wt encoding utf 8 as fw print fw.readable print fw.writable false true w t with open 36w.txt w t encoding utf 8 as fw print fw.re...