2014-09-22 89 views
3

是否有人直接使用terminfo功能類似於tputs(),tparm(),tigetstr(),tigetnum()直接使用終端功能

我找不到任何具有這些低級終端功能的實際示例。

是不是每個人都使用ncurses庫來控制終端,不打擾這個低級代碼?

這個低級代碼很難閱讀,我想。

我應該打擾這個低級代碼,或者只是學習ncurses,這是用ncurses提供的更高級別的代碼很少壓倒性?

如果有人知道關於這些低級功能的實用信息,請與我分享。

+0

如果您想使用不使用整個屏幕的'ncurses'來執行低級別的函數,如突出顯示文本片段或計算終端的尺寸。如果你想了解底層系統是如何工作的,我建議你閱讀Linda Mui,Tim O'Reilly和John Strang的* Termcap&Terminfo *。 – fuz 2014-09-22 20:53:57

回答

2

是否每個人都使用ncurses庫來控制終端,並不打擾這個低級代碼?

這很容易檢查。

首先,在ncurses庫中準備一個函數列表。在我的系統上:

nm -D /lib64/libncurses.so.5.9 | fgrep ' T ' \ 
    | sed 's/^[0-9A-Fa-f ]*T //' > /tmp/ncurses-functions-list 

現在看看有多少這些在各種程序中使用。

for f in /usr/bin/* ; do 
    nm -D $f 2>/dev/null | fgrep ' U ' \ 
     | sed 's/^ *U //' \ 
     | fgrep -x -f - /tmp/ncurses-functions-list && echo ==== $f; 
done 
+0

請原諒我,請你解釋一下這個腳本一步一步地做什麼 – koder16 2014-09-23 12:16:05

+0

第一個命令會建立符號列表(nm -D),然後將它過濾爲只留下全局定義的函數(fgrep),然後編輯出除了函數名稱(sed)。第二個程序在/ usr/bin中執行程序,併爲每個程序構建符號列表(nm -D),然後對其進行過濾以僅留下未定義的符號(fgrep'U'),然後對其進行編輯以僅留下函數名稱(sed),然後在第一階段構建的列表中找到這些函數(fgrep -x -f - ),然後打印程序名稱(echo)。最後你會看到每個程序直接調用libncurses的函數。 – 2014-09-23 17:37:07

0

該腳本是一個起點,但需要改進。首先,告訴它做什麼:

  • 「納米-D」列出了動態符號,即那些指向一個外部庫。
  • 第一步從ncurses庫中獲取符號列表,然後通過查找在定義函數名稱的位置找到的模式「T」來對其進行過濾。
  • 結果保存到文件/ tmp/ncurses的功能列表之後,所述第二腳本測試每個節目在/ usr/bin中
  • 在第二腳本中的過濾器模式爲未定義符號,即,來自另一個庫的數據庫
  • 過濾的結果是函數(或數據)名稱的列表,然後與第一步中創建的列表進行匹配。

改進它的一種方法是顯示(如最初所要求的那樣)哪些程序使用低級接口,哪些使用高級ncurses接口。正如在ncurses FAQ Types of library users中指出的那樣,區分它們的方法是查看哪些程序調用initscr或newterm(需要初始化高級接口),哪些不調用。一個簡單的「ldd」將顯示哪些程序與ncurses鏈接(以提供總數),並將這兩個函數列表減少到第二個腳本 - 使用高級界面。

+0

順便提一下,問題中提到的「低級」代碼將通過前面提供的腳本作爲答案來找到,因爲它不區分高/低級接口。 – 2015-02-05 23:25:36