1. 程式人生 > >Unix系統編程(一)

Unix系統編程(一)

一個 指向 posix 返回 write 指定 str 讀取 資源

主要內容:文件輸入/輸出的系統調用。

在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系統編程(一)