關於系統級I O的一些解析

2021-10-01 08:16:20 字數 1818 閱讀 4634

輸入/輸出(i/o)是在主存和外部裝置(如磁碟驅動器、終端、網路)之間複製資料的過程:

①輸入操作是從i/o裝置複製資料到主存。

②輸出操作是從主存複製資料到i/o裝置。

所有語言的執行時系統都提供執行i/o的較高階別工具。在linux系統中,是通過使用由核心提供的系統級unix i/o函式來實現這些較高階別的i/o函式的。

所有的i/o裝置都被模型化為檔案,而所有的輸入和輸出都被當作對相應檔案的讀和寫來執行,所以說linux中一切皆檔案。

所有的輸入和輸出都以一種統一且一致的方式來執行:

①開啟檔案。應用程式要求核心開啟相應檔案,核心返回乙個小的非負整數,叫 描述符。它在後續對此檔案的所有操作中標識這個檔案。

②linux shell建立的每個程序開始時都有三個開啟的檔案。1.標準輸入(描述符為0)。2.標準輸出(描述符為1)。3.標準錯誤(描述符為2)。標頭檔案定義了常量stdin_fileno、stdout_fileno、stderr_fileno來代替顯式的描述符值。

③改變當前的檔案位置。每個開啟的檔案,核心保持著乙個檔案位置k,初始值為0。這個檔案位置是從檔案開頭起始的位元組偏移量。

④讀寫檔案。1.讀操作從檔案複製n個位元組到記憶體,從當前檔案位置k開始將k增加到k+n。2.寫操作是從記憶體複製n個位元組到另乙個檔案,從當前位置k開始,更新k。

⑤關閉檔案。

linux核心將所有檔案都組織成乙個目錄層次結構,由名為 『/』 的根目錄確定。

檔案操作首先要的就是開啟檔案。使用open函式即可。函式原型為:

int open(char *filename,int flages,mode_t mode);

open函式將filename轉換為乙個檔案描述符,並返回描述符數字。返回的描述符總是在程序中!!當前沒有被開啟!!的最小描述符。所以像:

fd1=open(「foo.txt」,o_rdonly,0);的話,系統自動開啟0,1,2這三個檔案,所以當前沒被開啟的最小描述符是3,所以fd1=3。

✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂

i/o重定向

linux shell提供了i/o重定向操作符,允許使用者將磁碟檔案和標準輸入輸出聯絡起來。我們可以利用dup2函式來讓i/o重定向工作。dup2的函式原形為:

int dup2(int oldfd,int newfd);

dup2函式複製描述符表表項oldfd到描述符表表項newfd, 覆蓋 描述符表表項newfd以前的內容。若newfd已經開啟了,dup2會在複製oldfd之前關閉newfd。從此以後,任何寫道標準輸出的資料都被重定向到檔案b。(這裡用到了共享檔案的知識)

dup2前:

dup2後:

我們可以看看這個函式的執行:

a.text檔案裡的內容變化情況為:

pqrs---->write函式在檔案末尾追加jklmn,此時檔案內容為pqrsjklmn–>將fd1重定位給fd2,讀寫位置是指向fd2的檔案末尾,此時寫會覆蓋jklmn,檔案內容為pqrswxyzn–>繼續追加,檔案內容為:pqrswxyznef。

關於I O模型的一些理解

參照的文章 i o模型 在開始nio的學習之前,先對i o的模型有乙個理解,這對nio的學習是絕對有好處的。我畫一張圖,簡單表示一下資料從外部磁碟向執行中程序的記憶體區域移動的過程 這張明顯忽略了很多細節,只涉及了基本操作,下面分析一下這張圖。使用者空間和核心空間 乙個計算機通常有一定大小的記憶體空...

關於標準IO流的一些認識

c語言庫中有乙個file的結構體,當我們開啟乙個檔案的時候,會用到file 型別的指標來操作fopen所返回的乙個指標,這個指標就是流。流是作業系統管理io的乙個引入的概念,乙個流是與乙個描述符繫結在一起的。所以也可以根據流來得到乙個描述符。標準io庫有三種型別的緩衝 1 全緩衝2 行緩衝3 無緩衝...

關於推薦系統的一些想法

如何有效的利用使用者資訊來提公升推薦的精度和使用者體驗是乙個尚待解決的問題 大致可以總結下以後大的研究方向,有時間再進一步深挖!1 深度復合模型 deep composite models 2 使用者和物品的深度理解 3 temporal dynamics 4 cross domain recomm...