Understanding Unix/Linux Programming note:chapter 6:爲用戶編程:終端控制和信號

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) )

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章