?? 文件和設備編程.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>文件和設備編程</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY style="FONT-SIZE: 9pt; FONT-FAMILY: 宋體">
<CENTER>
<TABLE cellSpacing=10 cellPadding=10 width="60%" bgColor=#ffb693>
<TBODY>
<TR>
<TD align=middle><FONT
size=+2><!--標題由此開始-->文件和設備編程</FONT></TD></TR></TBODY></TABLE></CENTER>
<P>
<H3>目 錄</H3><!--目錄由此開始--><A id=Content name=Content></A>
<OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I318">文件和設備編程</A>
<OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I319">文件訪問原語</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I320">網卡驅動編寫</A>
<OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I321">概述</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I322">設備驅動</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I323">需要注意</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I324">參考</A>
</LI></OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I325">設備驅動</A>
<OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I326">概述</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I327">數據結構</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I328">初始化</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I329">管理流程</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I330">添加字符設備</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I331">添加塊設備</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I332">一個虛擬的字符設備驅動程序</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I333">代碼范例</A>
<OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I334">header.c</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I335">init.c</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I336">ioctl.c</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I337">open.c</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I338">read.c</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I339">release.c</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I340">tdd.c</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I341">write.c</A>
</LI></OL></LI></OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I316">讀寫音頻</A>
<OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I732">錄音</A>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I733">調節音量</A>
</LI></OL>
<LI><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#I342">pro結構</A></LI></OL></LI></OL>
<HR>
<BR><A id=I318 name=I318></A>
<CENTER><B><FONT size=+2>文件和設備編程</FONT></B></CENTER><BR>
<CENTER><A
href="file:///E:/linux資料/linux筆記及源碼/joyfire-0206.htm/system/10.html#Content">[目錄]</A></CENTER>
<HR>
<BR><A id=I319 name=I319></A>
<CENTER><B><FONT size=+2>文件訪問原語</FONT></B></CENTER><BR> POSIX
API 最重要的一個抽象概念就是文件。盡管幾乎所有的操作系統都將文件用于永久性存儲器,但所有 Unix 版本通過文件抽象概念提供對大多數系統資源的訪問。
<P> 更具體地說,這意味著 Linux 使用相同的一組系統調用來提供對設備(例如軟盤和磁帶設備)、網絡資源(最常見的是
TCP/IP 連接)、系統終端,甚至內核狀態信息的訪問。感謝無所不在的系統調用,嫻熟地使用與文件相關的調用對于每個 Linux
程序員來說都很重要。讓我們仔細查看一下文件 API 背后的一些基本概念,并描述最重要的文件相關系統調用。
<P> Linux
提供許多不同種類的文件。最常見的類型就簡稱為常規文件,它存儲大量用于以后訪問的信息。您所使用的絕大部分文件 -- 例如可執行文件(如
/bin/vi)、數據文件(如 /etc/passwd)和系統二進制文件(如 /lib/libc.so.6)--
都是常規文件。它們通常駐留在磁盤上的某處,但我們稍后會發現,并不一定都是這種情況。
<P> 另一種文件類型是目錄,它包含了一個其它文件及其位置的列表。使用 ls
命令列出目錄中的文件時,它打開該目錄的文件,并打印出它所包含的所有文件的信息。
<P>
其它文件類型包括塊設備(表示文件系統高速緩存的設備,例如硬盤驅動器)、字符設備(表示非高速緩存的設備,例如磁帶驅動器、鼠標和系統終端)、管道和套接字(允許進程相互之間對話),以及符號鏈接(允許文件在目錄層次結構中有多個名稱)。
<P> 大多數文件都有一個或多個引用它們的符號名。這些符號名是一組由 / 字符定界的字符串,并向內核標識文件。它們是
Linux 用戶所熟悉的路徑名;例如,路徑名 /home/ewt/article
引用的是我手提電腦中包含這篇文章文本的文件。沒有兩個文件可以共享相同的名稱(但單一文件可以有多個名稱),因此路徑名唯一地標識單一文件。
<P>
進程可以訪問的每個文件都由一個小的非負整數標識,稱為“文件描述符”。文件描述符由打開文件的系統調用創建,并由從當前進程創建的新子進程繼承。就是說,當進程啟動了一個新程序時,原始進程的打開文件通常是由新程序繼承的。
<P> 按照約定,大多數程序保留前三個文件描述符(0、1 和 2)用于特殊目的 --
訪問所謂的標準輸出、標準輸出和標準錯誤流。文件描述符 0 是標準輸入,這里許多程序都將從外部世界接收輸入。文件描述符 1
是標準輸出。大多數程序在這里顯示正常的輸出。對于與錯誤情況相關的輸出,使用文件描述符 2(標準錯誤)。
<P> 任何習慣使用 Linux shell 的人都曾看到過標準輸入、輸出和錯誤文件描述符的使用。通常,shell
運行命令時帶文件描述符 0、1 和 2,都是指 shell 的終端。當使用 > 字符指示 shell 將一個程序的輸出發送給另一個程序時,shell
在調用新程序之前打開該文件作為文件描述符 1。這將導致程序將它的輸出發送給指定的文件而不是用戶終端;其妙處是,對于程序本身,這是透明的!
<P> 與之類似,"<" 字符指示 shell 使用特定的文件作為文件描述符
0。這樣就強迫程序從該文件中讀取它的輸入;這兩種情況下,任何來自程序的錯誤仍將出現在終端上,如同它們在文件描述符 2 的情況下發送給標準錯誤一樣。(在
"bash" shell 中,可以使用 2> 而不是 > 將標準錯誤重定向)。這種類型的文件重定向是 Linux 命令行最強大的特性之一。
<P> 使用任何與文件相關的系統調用之前,程序應該包括 <fcntl.h> 和
<unistd.h>;它們為最普遍的文件例程提供了函數原型和常數。在下面的示例代碼中,我們假設每個程序開始處都有
<P>#include <fcntl.h><BR>#include <unistd.h>
<P> 首先,讓我們了解如何讀寫文件。憑直覺就可以知道,read() 和 write()
系統調用是執行這些操作的最常用方法。這兩種系統調用將有三個自變量:要訪問的文件描述符、指向要讀寫的信息的指針以及應該讀寫的字符數。返回成功讀寫的字符數。清單 1
說明了一個簡單的程序,它從標準輸入(文件描述符 0)中讀取一行,并將它寫入標準輸出(文件描述符 1):
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -