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 視為文件。

連接可以看作是處理步驟的組合。