檔案開啟
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操作成功。不代表資料已經傳送到了接收方,僅僅代表資料已經放入網路緩衝區中。
不同的開啟方式有不同的適用場景。在選擇的時候一定要依據實際需求來確定。如支援高併發的webserver都會選用非堵塞模式處理socket。
linux最開始僅僅有普通方式,其它的方式一定為了處理各種使用場景而逐漸新增的。
當然不排除某位大牛拍腦袋想出來的。
linux檔案開啟模式
檔案開啟 int open const char pathname int flags mode t mode 普通方式 canonical mode flags中沒有設定o sync and o direct。這種方式中read是阻塞呼叫 blocking call 等到磁碟資料讀取完畢後返回 w...
檔案的開啟模式
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...