当前位置:  技术问答>linux和unix

linux终端编程的一些小问题,希望得到解答!

    来源: 互联网  发布时间:2017-05-24

    本文导语:  大家好,最近开始着手学习linux程序设计这本书,看到第五章终端输出的时候对那个terminfo的工作机制不是很了解,希望请教一下如下几个问题: 1:tpus函数的工作原理是什么?函数原型是: int tputs(char *const str,int af...

大家好,最近开始着手学习linux程序设计这本书,看到第五章终端输出的时候对那个terminfo的工作机制不是很了解,希望请教一下如下几个问题:
1:tpus函数的工作原理是什么?函数原型是:
int tputs(char *const str,int affcnt, int (*putfunc) (int));
我的理解是str指向的字符串的值传递给用户指定的putfunc这个函数,让这个函数对其进行处理。不知理解的是否到位?
2:程序段中clear获取的是功能标志clear中的值,然后调用tputs函数再传递给char_to_terminal函数进行屏幕的清屏处理,请问为何将clear中的值传递给char_to_terminal函数进行putc输出流就可以清屏?是否因为clear中已经由系统设置好了一系列的转义字符,从而我们可以使用这些转义字符进行控制?
3:关于tputs函数中参数affcnt,书上的解释是受这一函数变化影响的行数,请问这个行数是一个什么样子的概念?

对以上问题本菜鸟不是很清楚,下面的程序段我做了一系列的注释,不知道对这块理解的是否到位?因为是初学linux编程没多久,所以对某些概念依旧模糊不清,希望各位前辈能够不吝赐教,指点一二!谢谢!
#include 
#include 
#include 
#include 
#include 
#include 

static FILE *output_stream = (FILE *)0;

char *menu[] = {                         //菜单数组
    "a - add new record",
    "d - delete record",
    "q - quit",
    NULL,
};

int getchoice(char *greet, char *choices[], FILE *in, FILE *out);
int char_to_terminal(int char_to_write);

int main()
{
    int choice = 0;
    FILE *input;    //定义两个输入输出流
    FILE *output;
    struct termios initial_settings, new_settings;   //定义两个termios结构,initial存放默认的终端接口变量的值,new存放新的终端接口变量的值

    if (!isatty(fileno(stdout))) {                      //使用fileno获取当前终端的文件描述符,并且用isatty函数进行判断是否为一个终端
        fprintf(stderr,"You are not a terminal, OK.n");
    }

    input = fopen("/dev/tty", "r");       //以只读方式打开/dev/tty设备,并且把文件流赋值给input
    output = fopen("/dev/tty", "w");     //同上
    if(!input || !output) {
        fprintf(stderr, "Unable to open /dev/ttyn");
        exit(1);
    }
    tcgetattr(fileno(input),&initial_settings);  //把当前终端接口变量的值存放到initial参数指向的结构中去
    new_settings = initial_settings;            //初始化新的一个termios的结构变量,用下面的标志位进行设置新的值
    new_settings.c_lflag &= ~ICANON;
    new_settings.c_lflag &= ~ECHO;
    new_settings.c_cc[VMIN] = 1;
    new_settings.c_cc[VTIME] = 0;
    new_settings.c_lflag &= ~ISIG;
    if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {               //用tcsetattr设置好最新的终端设置如果失败则输出提示信息
        fprintf(stderr,"could not set attributesn");
    }

    do {
        choice = getchoice("Please select an action", menu, input, output);      //进行选择
        printf("You have chosen: %cn", choice);
sleep(1);
    } while (choice != 'q');

    tcsetattr(fileno(input),TCSANOW,&initial_settings);
    exit(0);
}

int getchoice(char *greet, char *choices[], FILE *in, FILE *out)
{
    int chosen = 0;
    int selected;
    int screenrow, screencol = 10;       //初始化屏幕的横竖参数

    char **option;
    char *cursor, *clear;

    output_stream = out;           //用output_stream存放输出流

    setupterm(NULL,fileno(out), (int *)0);   //将当前终端类型设置为参数term指向的值,因为此时term是空指针,就使用环境变量term的值
    cursor = tigetstr("cup");       //返回当前terminfo中字符串变量cup的值
    clear = tigetstr("clear");      //同上

    screenrow = 4;                    //设置横边为4
    tputs(clear, 1, char_to_terminal);            //????????
    tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);  //???????
    fprintf(out, "Choice: %s", greet);
    screenrow += 2;
    option = choices;
    while(*option) {
        tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
        fprintf(out,"%s", *option);     //由于这里用了screenrow控制,就不许要换行符了。
        screenrow++;
        option++;
    }
    fprintf(out, "n");

    do {
fflush(out);           //清空输出缓冲区
        selected = fgetc(in);
        option = choices;
        while(*option) {
            if(selected == *option[0]) {
                chosen = 1;
                break;
            }
            option++;
        }
        if(!chosen) {
            tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);  //?????
            fprintf(out,"Incorrect choice, select againn");
        }
    } while(!chosen);
    tputs(clear, 1, char_to_terminal);
    return selected;
}

int char_to_terminal(int char_to_write)
{
    if (output_stream) putc(char_to_write, output_stream);
    return 0;
}






|
这个没涉及过,回答不了

    
 
 

您可能感兴趣的文章:

  • secureCRT下Linux终端汉字乱码解决方法
  • suse linux telnet连接到第30个终端后,无法打开新的终端
  • linux终端或仿真终端如何打印图形??
  • linux终端程序时如何隐藏终端
  • 有能在windows下连接linux(作为一个shell终端或x终端)的软件么?
  • SuSE Linux 下"X终端"与"终端程序-超级用户模式"有什么区别?
  • 如何在linux(终端:ctrl+alt+F1之类的。绝非虚拟终端)下显示256色或24位的BMP图片?
  • linux下观察串口的程序是哪个, 是终端吗.
  • linux 系统如何退出全屏终端
  • 1台linux用什么命令或软件能做另外一台linux的终端(用串口)!!!
  • 如何设置一台 Linux 让它支持串口的终端登陆?
  • LINUX有没有终端服务?
  • 请问怎么在linux下使用windows终端?
  • 不在终端下工作,根本就不算是用过UNIX/LINUX
  • 请问linux里面的六个虚拟终端是不是在安装的时候就默认有的
  • 求助Linux终端调整屏幕位置的问题!谢谢
  • Linux守护进程 的子进程 终端处理
  • 我想用Linux的串口和S3c2410x连接,请问在Linux里面怎么找到那个超级终端?
  • linux中如何在得到当前终端窗口的宽度?
  • Linux终端服务器 LTSP
  • 怎么从超级终端进入linux登录界面?
  • 虚拟机里linux系统下输入l,k,m三个字母不能正常显示,求解答
  • Linux创建进程的问题,请高手帮忙解答一下?
  • linux 中 困惑的地方,求解答。
  • linux下的mib读取问题?大虾帮解答下
  • linux 毕业设计求解答
  • Linux下CVS仓库的问题?菜鸟在线急等人来解答??
  • SSH 无法登陆LINUX,什么问题?帮忙解答下啊
  • 安装linux~~~~有点棘手,请给解答
  • 请高手解答linux无法启动的问题
  • 嵌入式Linux使用外挂Vsftpd不能正常使用, 请高手解答,谢谢。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我在windows下telnet到linux主机,想得到linux主机的一个文件该怎么办?
  • linux下如何编程得到网卡的硬件描述,如得到某块网卡为“3Com 3c590/3c595....”
  • 如何得到linux机器的时钟频率?
  • Linux下得到进程号
  • 在LINUX怎么得到按键编码呀
  • linux下怎样得到输入的完整的命令行?
  • 怎样得到linux下库函数的列表?
  • 如何在win98下得到linux源代码,turbolinux
  • 如何得到Linux的系统命令源代码,比如ping,mount,ls等?
  • 急::在Linux下怎么根据另一台windows或linux的文件名,去得到这个文件
  • 怎样在Linux下得到某个目录下的文件的名称
  • 在Redhat linux中怎样方便快捷的得到操作系统帮助?
  • 在LINUX下如何得到屏幕截图?
  • Linux 下有什么命令可以得到 一个字符串 的第n个字母.
  • Linux下如何得到本机显卡信息
  • 哪里能够得到RedHat Linux Advance Server 2.1(x86) ?!
  • linux下有没有命令可以得到当前登录用户的密码?
  • Linux下如何得到系统最后一次启动时间
  • 如何得到linux的路由表?
  • 急问:如何得到linux下c程序运行中的IO等待时间?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • Linux c字符串中不可打印字符转换成16进制
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3