在linux TTY編程時會涉及到 termios 結構,其中c_cc數(shù)組里面,有 VTIME 和 VMIN 下標。關于他們的使用經(jīng)常令人迷惑,查閱了不少博客,上面的講解也有不少誤區(qū)。
在這里重新對這二者關系進行介紹。結合實驗會令人記憶更深刻。
VTIME 和 VMIN 的值只能用于非標準模式,兩者結合起來共同控制對輸入的讀取。此外,兩者結合使用還能控制在一個程序試圖讀取與一個終端關聯(lián)的文件描述符時將發(fā)生的情況。
兩者結合使用分為下面4種情況:
VMIN = 0 和 VTIME = 0 :在這種情況下,read 調(diào)用總是立刻返回。如果有等待處理的字符,read 就會立刻返回;如果沒有字符等待處理,read 調(diào)用返回0,并且不讀取任何字符;VMIN = 0 和 VTIME > 0 :在這種情況下,只要有字符可以處理或者是經(jīng)過 VTIME 個十分之一秒的時間間隔,read 調(diào)用就返回。如果因為超時而未讀到任何字符,read 返回0,否則 read 返回讀取的字符數(shù)目。VMIN > 0 和 VTIME = 0 :在這種情況下,read 調(diào)用將一直等待,直到有 MIN 個字符可以讀取時才返回,返回值是讀取的字符數(shù)量。到達文件尾時返回0。VMIN > 0 和 VTIME > 0 :在這種情況下,當 read 被調(diào)用時,它會等待接收一個字符。在接收到第一個字符及后續(xù)的每個字符后,一個字符間隔定時器被啟動(如果定時器已經(jīng)運行,則重啟它)。當有 MIN 個字符可讀或兩個字符之間的時間間隔超過 TIME 個十分之一秒時,read 調(diào)用返回。這個功能可用于區(qū)分是單獨按下了 Escape 鍵還是按下一個 Escape 鍵開始的功能組合鍵。但要注意的是,網(wǎng)絡通信或處理器的高負載將使得類似這樣的定時器失去作用。通過設置非標準模式與使用的 VMIN 和 VTIME 值,程序可以逐個字符地處理輸入。
|
新聞熱點
疑難解答