Unix系統編程(一)
主要內容:文件輸入/輸出的系統調用。
在Linux中,萬事萬物皆文件。
文件描述符的概念
通用I/O模型的系統調用:
打開文件 open
關閉文件 close
向文件寫數據 write
從文件讀數據 read
這些系統調用不僅可以對普通的文件類型進行操作,也可以對管道、終端等所有類型的文件施以輸入/輸入操作。
所有執行I/O操作的系統調用都以文件描述符,一個非負整數(通常是小整數),來指代打開的文件。
用文件描述符表示所有類型的已打開文件,包括管道(pipe)、FIFO、socket、終端、設備和普通文件。(至今只操作過普通文件,其他幾個類型還沒接觸過)
針對每個進程,文件描述符都自成一套。(沒看懂)
3個標準的文件描述符
當在shell中操作的時候,有3個文件描述符始終是打開的。
在交互式的shell中,這個3個文件描述符通常指向shell運行所在的終端。(就是我們遠程連接時候的屏幕?)
如果命令行制定對輸入/輸出進行重定向操作,那麽shell會對文件描述符做適當修改,然後再啟動程序。
文件描述符 用途 POSIX名稱 stdio流
0 標準描述符 STDIN_FILENO stdin
1 標準輸出 STDOUT_FILENO stdout
2 標準錯誤 STDERR_FILENO stderr
這裏的意思是雖然shell開始會用0,1,2來這三個文件描述符代替標準輸入,標準輸入和標準錯誤,但是這種操作就像是給變量賦初始值一樣。這些文件描述符並沒有綁死,而是可以用freopen系統調用指向其他的任何文件對象。
fd = open(pathname, flags, mode)
打開pathname所標識的文件,並返回文件描述符,這個文件描述符就代表了打開的文件,並且在函數調用中用這個描述符就好了。
如果要打開的文件不存在,open()函數可以創建它,但是這取決於flags中的選項。
flags還指定了文件的打開方式:只讀、只寫或者是讀寫方式。
mode指定了由open()調用創建文件的訪問權限(u,o,g,w, x,r),如果open()函數並沒有創建文件,那麽可以忽略或省略mode參數。
馬丹,這塊不熟,一個系統調用涉及到的東西這麽多。
numread = read(fd, buffer, count)
從fd所指代的文件讀取至多count字節的數據,並存儲到buffer中。read()調用的返回值為實際讀取到的字節數。如果再無字節可讀(例如:讀到文件結尾符EOF時),則返回0。
numwrite = write(fd, buffer, count)
從buffer中讀取多達count字節的數據寫入由fd指代的已打開文件中,write()調用的返回值為實際寫入文件中的字節數,且有可能小於count。
status = close(fd)
在所有的輸入/輸出操作完成以後,調用close(),釋放文件描述符fd以及與之相關的內核資源。
例子:用通用I/O系統調用實現一個簡版的cp命令
Unix系統編程(一)