2014-09-22 93 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