美文网首页LinuxLinux学习之路
APUE读书笔记-18终端输入输出(15)

APUE读书笔记-18终端输入输出(15)

作者: QuietHeart | 来源:发表于2020-09-08 21:02 被阅读0次

    下面的程序测试了raw和cbreak模式。

    运行下面的程序,我们可以看到终端的模式发生了什么现象。

    测试raw和cbreak终端模式

    #include "apue.h"
    static void sig_catch(int signo)
    {
        printf("signal caught\n");
        tty_reset(STDIN_FILENO);
        exit(0);
    }
    
    int main(void)
    {
        int    i;
        char   c;
    
        if (signal(SIGINT, sig_catch) == SIG_ERR)   /* catch signals */
            err_sys("signal(SIGINT) error");
        if (signal(SIGQUIT, sig_catch) == SIG_ERR)
            err_sys("signal(SIGQUIT) error");
        if (signal(SIGTERM, sig_catch) == SIG_ERR)
            err_sys("signal(SIGTERM) error");
    
        if (tty_raw(STDIN_FILENO) < 0)
            err_sys("tty_raw error");
        printf("Enter raw mode characters, terminate with DELETE\n");
        while ((i = read(STDIN_FILENO, &c, 1)) == 1) {
            if ((c &= 255) == 0177)     /* 0177 = ASCII DELETE */
                break;
            printf("%o\n", c);
        }
        if (tty_reset(STDIN_FILENO) < 0)
            err_sys("tty_reset error");
        if (i <= 0)
            err_sys("read error");
        if (tty_cbreak(STDIN_FILENO) < 0)
            err_sys("tty_cbreak error");
        printf("\nEnter cbreak mode characters, terminate with SIGINT\n");
        while ((i = read(STDIN_FILENO, &c, 1)) == 1) {
            c &= 255;
            printf("%o\n", c);
        }
        if (tty_reset(STDIN_FILENO) < 0)
            err_sys("tty_reset error");
        if (i <= 0)
            err_sys("read error");
        exit(0);
    }
    

    运行与输出如下:

    $ ./a.out
    Enter raw mode characters, terminate with DELETE
                                                     4
                                                       33
                                                         133
                                                            61
                                                              70
                                                                176
                              type DELETE
    Enter cbreak mode characters, terminate with SIGINT
    1                         type Control-A
    10                        type backspace
    signal caught             type interrupt key
    

    在raw模式中,输入的字符是Control-D(04)和特殊功能键F7。在使用的终端上面,这个功能键会产生如下5个字符:ESC(033), [ (0133), 1 (061), 8 (070), 和 ~ (0176)。需要注意的是,raw模式中的输出处理被关闭的情况下(~OPOST),我们在每个字符后面无法获得返回的回车。我们也需要注意,特殊字符的处理在cbreak模式中是被禁止的(所以,像Control-D, end-of-file字符, 以及 backspace没有被特别地处理),然而终端产生的信号还是始终被处理的。

    译者注

    原文参考

    参考: APUE2/ch18lev1sec11.html

    相关文章

      网友评论

        本文标题:APUE读书笔记-18终端输入输出(15)

        本文链接:https://www.haomeiwen.com/subject/jgmnjktx.html