Linux程序设计第五章

来源:互联网 发布:编程时说a having been 编辑:程序博客网 时间:2024/05/22 00:47
国庆了,首先祝大家国庆快乐!山里面是一个很神奇的世界,不管是国庆,元旦,永远都跟平常一模一样,没有一点节日的气息。其实呆着呆着也就习惯了。找个时间出去溜达溜达吧。。直到如今,才会真正去考虑找工作这事。不想多提。
        第五章讲的是终端,原本觉得其实这一章没什么用处。不过看到最后,还是觉得,里面的一些东西挺有用的。至少在某些实际应用中,可能会需要用到。比如说:去掉终端的回显(这可用于输入密码的时候).
        本章,将学习以下内容:
1.对终端进行读写
2.终端驱动程序和通用终端接口
3.termios
4.终端的输出和terminfo
5.检测键盘击键动作


 5.1标准模式和非标准模式
标准模式:所有的输入都基于行处理,只有在用户按下确认键(通常是回车键)的时候,才进行处理.
非标准模式,刚好相反,输入一个字符就立马处理,不需要按回车.
其中Linux用isatty(系统调用)来测试标准输出是否被重定向了,如果打开的文件描述符连接到一个终端,则返回1,否则返回0.

5.4termios结构
这是POSIX规范中定义的标准接口,通过设置termios类型的数据结构中的值和使用一小组函数调用可以对终端接口进行控制,termios包含在termios.h中.

这是结构体的定义.
#include<termios.h>
struct termios
{
    tcflag_t      c_iflag; //输入模式
   
tcflag_t     c_oflag;//输出模式
   
tcflag_t      c_cflag;//控制模式
    tcflag_t      c_lflag;//本地模式
     cc_t          c_cc[NCCS]; //特殊控制字符.

}

可以调用tcgetattr(int fd,struct termios *termios_p);来初始化一个与终端对应的termios结构.该调用把当前终端接口变量的值写入termios_p参数指向的结构.

可以调用tcsetattr来重新配置终端接口.

其中四种模式中,本地模式最为有用,应当了解.其余的基本没有用到.


下面我们给出一种密码程序常用的方法,消除回显.
#include<termios.h>
#include<stdio.h>
#include<stdlib.h>

#define PASSWORD_LEN 8

int main()
{
    struct termios init,new;
    char pwd[]PASSWORD_LEN];

    tcgetattr(fileno(stdin),&init);//获取标准输入的当前设置。做一个备份,以便用完之后还原。    
    
    new = init;
    new.c_lflag &= ~ECHO;//去除回显,输入密码的时候将看不到回显;
    
    ...
    //接下来将刚才的设置还原回去
    if(tcsetattr(fileno(stdin),TCSAFLUSH,&new) !=  0)
{
    fprintf("error\n");
}
else
{
    ...
}
}

完成。

此外termios还有一种常见用法。一旦输入字符,立刻读取。通过关闭标准模式以及结合MIN和TIME(termios中c_cc数组的下标)设置来实现。

5.5.2识别终端类型。
可以通过echo $TERM 来判断自己目前正在使用的终端。其中terminfo功能标志可以控制终端的输出等等(晦涩难懂,擦)。

5.6检测击键动作。
Linux下和Unix下并没有类似于MS—DOS中的kbhit函数,因为linux下编的程序几乎不会忙于等待某个时间的发生,因此并没有实现这个函数。但如果需要移植Ms-dos的程序,能够模拟kbhit的功能将会很方便。这里给出解决方案,算了其实我觉得这个挺没意思的。用到的时候再说吧。


OK,就这样,结束第五章。很多事情,其实没有那么难。永远不要放弃,找工作也一样。希望所有现在找工作的学长学姐们,都能有一个满意的工作。Good luck!
国庆快乐,每个人。


原创粉丝点击