linux 設備文件的操作
文件:包含數據,具有屬性,通過目錄中的名字被標識,
可以從文件讀數據,可以向文件寫數據。
設備也支援文件的操作。
每個設備都被當作一個文件,具有文件名,i-節點號,文件所有者,許可權位的集合,最新修改時間。
設備支援系統調用:open,read,write,lseek,close,stat。
設備文件和文件大小:設備文件是一個鏈接,而不是容器。
設備文件的i-節點存儲的是指向內核子程式的指針,而不是文件的大小和存儲列表。子程式被稱為設備驅動程式。
ls -al /dev/pts/0
crw--w---- 1 yingziliu tty 136, 0 2021-12-23 06:35 /dev/pts/0
136:指的是設備-進程表中編號位136的子程式,參數是0
136 和 0被稱為設備的主設備號和次設備號。
主設備號確定處理該設備時實際的設備驅動程式,從設備號被作為參數傳輸到該子程式。
每個文件都有相應的讀、寫和執行許可權,這些許可權意味著對設備的操作。
每個i-節點編號指向i-節點表中的一個結構,i-節點可以是磁碟文件,也可以是設備文件的i-節點。
i-節點的類型被記錄在結構stat的成員變數st_mode的類型區域中
通過查看i-節點的內核文件類型,內核區分磁碟文件和設備文件,進行讀取磁碟和訪問內核設備驅動程式。
磁碟文件的i-節點包含指向數據塊的指針,設備文件的i-節點包含指向內核子程式表的指針,主設備號用於告知設備讀取數據的那部分程式碼的位置。
如:read
內核首先找到文件描述符i-節點,該i-節點用於告訴內核文件的類型。
文件是磁碟文件,內核可以通過訪問塊分配表來讀取數據;
文件是設備文件,內核調用設備驅動程式的read部分讀取數據。open,write,lseek,close等都是類似。
磁碟文件和設備文件的不同之處。
磁碟文件和設備文件都有文件名和屬性。系統調用open用於創建與文件設備的連接。
磁碟文件的連接通常有內核緩衝區,從進程到磁碟的位元組先被緩衝,然後才從內核的緩衝區被發送出去,
設備文件的連接,只需要儘快把數據傳說出去。
磁碟連接的屬性:
1.緩衝:兩個管道通過一個進程單元連接時的文件描述符,進程單元是用來進行緩衝和完成其他進程任務的。
int ret=fcntl(int fd, int cmd, ... /* arg */ )
屬性2:自動添加模式:對竟態操作很有用,O_APPEND 位的使能。
競爭和原子操作密切相關, lssek 和 write 的調用都是獨立的系統調用,內核可以隨時打斷進程,從而使後面的這兩個操作被中斷。
當O_APPEND 被置位時,內核將 lseek 和 write 組合成一個原子操作,被連接成一個不可分割的單元。
用 open 控制文件描述符
通常在打開一個文件時,可以通過系統調用 open 的第二個參數設置文件描述符的屬性
如 fd=open(WTMP_FILE, O_WRONLY|O_APPEND|OSYNC);
終端連接的屬性:
getchar 和 putchar 能夠在設備和進程間傳輸數據。
終端設備的緩衝:
1.進程在用戶輸入Return後才接受數據
2.進程將用戶輸入的Return(ASCII 13)看作換行符(ASCII 10)
3.進程發送換行符,終端接收回車換行符。
終端的設備驅動程式:處理進程和外部設備數據流的內核子程式的集合被稱為tty驅動程式
驅動程式包含很多控制設備操作的設置,進程可以讀、修改和重置這些驅動控制標誌。
stty命令:讀取和修改終端驅動程式的設置。
編寫終端驅動程式:關於函數
改變終端驅動程式的設置就像改變磁碟文件連接的設置一樣
1.從驅動程式獲得屬性
2.修改所要修改的屬性
3.將修改過的驅動程式送回驅動程式
#include <termios.h>
struct termios, settings;
tcgetattr(fd,&settings);
tcsetattr(fd,how,&settings);
終端文件是人們用來和Linux進程進行通訊的設備。
終端是一個設備,在目錄數中表現為一個特殊的文件,通常在/dev這個目錄中。
控制一個設備:ioctl
文件、設備和流
任何數據的源或者目的都被Linux 視為文件。
連接可以看作是處理步驟的組合。

