**輸入/輸出(i/o)**是在主存和外部裝置(例如磁碟檔案,終端和網路)之間複製資料的過程。輸入操作是從i/o裝置複製到主存,而輸出操作是從主存資料複製到i/o裝置。
「一切皆檔案」
而在linux中所有的i/o裝置統統被模型化為檔案,而所有的輸入輸出都被當做相應的檔案的讀和寫來執行。
進而我們認識一下開啟檔案函式(open),關閉檔案的函式(close),讀(read)和寫(write)函式。
open函式
open函式在linux下一般用來開啟或者建立乙個檔案,我們可以根據引數來定製我們需要的檔案的屬性和使用者許可權等各種引數。
我們先看看open函式在linux下的定義
#include #include #include int open(const char *filename, int flags, mode_t mode);
open函式將filename轉換成乙個檔案描述符,並且返回描述符數字。返回的描述符總是在在程序中沒有開啟的最小描述符。
flags引數指明了程序打算如何訪問這個檔案。而需要注意的是:引數flag必須指定以下三個常量的一種,且只允許指定乙個
o_rdonly:唯讀模式
o_wronly:只寫模式
o_rdwr:可讀可寫
mode引數表示設定檔案訪問許可權的初始值
如 open(filename,o-wronlt | o-creat | o-trunc,mode)是建立乙個檔案的標準格式。
2.close函式
close函式用於關閉乙個已經開啟的檔案。函式原型如下:
#include int close(int fd);
返回值:若成功則返回0,出錯則返回-1
引數:fd是檔案識別符號,是通過open函式獲得的檔案識別符號。
3.write函式
write函式用於向開啟的檔案寫入資料。函式原型如下:
#include
ssize_t write
(int fd,
const
void
*buf, size_t nbtyes
返回值:如果寫成功則返回實際寫入的位元組數,若出錯則返回-1。
引數:fd 檔案識別符號,由呼叫open函式從核心獲得。
*buf 待寫入資料的緩衝區位址。
nbytes 需要寫入檔案的資料位元組數。
即write函式從記憶體位置buf複製到至多n個位元組到描述符fd當前檔案位置。
4.read函式
read函式可以讀取檔案。讀取檔案指從某乙個已開啟地檔案中,讀取一定數量地字元,然後將這些讀取的字元放入某乙個預存的緩衝區內,供以後使用。
read函式原型:
ssize_t read
(int fd,
void
*buf,size_t count)
read 函式從描述符為fd的當前檔案位置複製到最多為count個位元組到記憶體位置buf.
下邊我們看一些例子:
/* $begin cpstdin */
#include
intmain
(void
)
-----這段程式是使用了read和write函式呼叫一次乙個位元組地從標準輸入複製到標準輸出。
#include
intmain
(int argc,
char
*ar**)
這裡介紹一下dup2函式。dup2是i/o重定向的一種方式。作用是用fd2所指檔案的內容覆蓋fd3所指檔案的內容,所以當fd2被讀取乙個字元(文字的第乙個字元)之後,到fd3讀取乙個字元讀的就是fd2讀取之後的下乙個字元,即文字的第二個字元,而fd1與fd2,fd3無關,所以其讀取的字元就是文字的第乙個字元。
執行結果如下:
3.
#include
intmain
(int argc,
char
*ar**)
計算機系統基礎學習技術日誌三(I O)
linux中有一句話叫,一切皆檔案。每個linux檔案都有乙個型別來表明它在系統中的角色 1.普通檔案 包含任意資料。應用程式常常要區分文字檔案和二進位制檔案,文字檔案即只含有ascii或unicode字元的普通檔案,二進位制檔案是所有其他檔案 2.目錄檔案 包含一組鏈結的檔案。其中每個鏈結都將乙個...
計算機系統基礎
includeint main return 0 如果將表示式換成 2147483647 1 2147483647 結果又會怎麼樣呢 編譯器如何處理字面量 高階語言中運算規則 高階語言與指令之間的對應 機器指令的執行過程 機器級資料的表示和運算 sum int a unsigned int len ...
計算機系統基礎 學習開篇
title 計算機系統基礎 學習開篇 author qian jipeng tags 作為乙個非科班出身的半吊子程式設計師 程式設計師?在和計算機專業的同學交流的過程中,切實感受到知識面的匱乏,總體體現在對計算機系統的理解。確實,作為一名雙非院校信管專業的學生,本身起步就比別人慢了不少,若沒有紮實的...