Key-word: stty,tcgetattr, tcsetattr, fcntl, signal, 終端驅動程序的模式、阻塞/非阻塞輸入
一、內容概要
Chapter 6的內容是chapter 5內容的應用和擴展。
用到的chapter 5的內容包括:
1)使用stty命令設置終端驅動程序的屬性:將終端設置爲規範/非規範模式;
2)使用tcgetattr, tcsetattr函數設置終端驅動程序的屬性:將終端設置爲規範/非規範模式、關閉回顯;
3)使用fcntl函數設置終端驅動程序的屬性:將終端設置爲阻塞/非阻塞輸入;
(注:由chapter 5的內容知,fcntl通常用來設置磁盤文件的屬性,tcsetattr纔是用來設置終端設備的屬性的。此處可以用tcsetattr函數實現,但是用fcntl實現更爲簡單)。
擴展的內容包括:signal的含義和應用。
二、重要概念:
1)規範模式:驅動程序輸入的字符保存在緩衝區,並且僅在收到回車鍵時纔將這些緩衝的字符發送到程序。
2)非規範模式:當緩衝和編輯功能被關閉時。(編輯功能指:如用Backspace刪除輸入的字符的功能;此模式下,在終端輸入字符時,無需Enter,字符當即被髮送到程序)。
3)阻塞輸入:當調用getchar或read從文件描述符讀取輸入時,程序阻塞,直到能獲得某些字符或是檢測到了文件的末尾。
4)非阻塞輸入:當調用getchar或read從文件描述符讀取輸入時,直接從緩衝區讀數據,無論緩衝區有無數據,都接着往下執行。 (通常需要和延時函數sleep一起使用) 。
三、內容組織順序
本章通過編寫play_again來講解以上內容。Play_again的功能:向用戶提出yes/no的問題,如是否再來一局。
先後使用了‘一’中列出的知識點來不斷完善該程序的功能。
四、signal
1、
信號是由單個詞組成的消息。每個信號都有一個數字編碼。
2、信號來自3個地方:
1)用戶。如用戶輸入:Ctrl-C。
2)內核。當進程執行出錯時,內核給進程發送一個信號。
3)進程。指兩個進程間的通信。
3、如何處理信號
通過調用signal函數實現對信號的處理,通常的處理方法有一下三種:
1)接受默認處理(通常是kill掉接收這個信號的進程)
2)忽略信號
3)調用一個函數
當是第三種情況時,非常類似於對中斷的處理(中斷也是一種信號),中斷可以觸發設定的函數。
函數原型:result = signal( int signum, void (* action) (int) )