04-终端

终端

对终端读写

getchar()
printf()
    
// 用于查看标准输出是否被重定向,如果打开的文件描述符fd连接到一个终端,返回1,否则返回0
#include <unistd.h>
int isatty(int fd);

int main(int argc, char const *argv[]) {
    if (!isatty(fileno(stdout))) {    // fileno 函数用于从输入输出流获取文件描述符
        fprintf(stderr, "输出被重定向\n");
    }
    return 0;
}

标准模式:只有使用回车键时才读取输入,允许使用 Backspace 和 delete 键。

非标准模式

Linux终端会将终端字符转换为对应的信号,如按下 Ctrl+C 时可以中断程序。

与终端对话

特殊设备 /dev/tty 即为终端,该设备始终指向当前终端或当前登录会话。

int main(int argc, char const *argv[])
{
    FILE *input;
    FILE *output;

    input = fopen("/dev/tty", "r");
    output = fopen("/dev/tty", "w");
    
    fprintf(output, "%c\n", fgetc(input));
    
    return 0;
}

termios 控制输入

通过设置termios类型数据结构和一组函数调用,可以控制终端接口。

#include <termios.h>
struct termios
  {
    tcflag_t c_iflag;		/* input mode flags */
    tcflag_t c_oflag;		/* output mode flags */
    tcflag_t c_cflag;		/* control mode flags */
    tcflag_t c_lflag;		/* local mode flags */
    cc_t c_line;			/* line discipline */
    cc_t c_cc[NCCS];		/* control characters */
    speed_t c_ispeed;		/* input speed */
    speed_t c_ospeed;		/* output speed */
  };
// 每个属性对应的宏定义于同一头文件下

// 初始化一个与终端对应的termios结构
// termios_p 用于配置终端接口
extern int tcgetattr (int __fd, struct termios *__termios_p) __THROW;
// 用于重新配置当前终端
extern int tcsetattr (int __fd, int __optional_actions, const struct termios *__termios_p) __THROW;


// 设置输入输出速度,读取类似
extern int cfsetspeed (struct termios *__termios_p, speed_t __speed) __THROW;
extern int cfsetospeed (struct termios *__termios_p, speed_t __speed) __THROW;
extern int cfsetispeed (struct termios *__termios_p, speed_t __speed) __THROW;

// 让调用程序一直等待,直到排队的输出都已发送完毕
extern int tcdrain (int __fd);
// 暂停或重新开始输出
extern int tcflow (int __fd, int __action) __THROW;
// 用于清空输入 输出
extern int tcflush (int __fd, int __queue_selector) __THROW;

终端的输出

# 系统变量表示终端类型
echo $TERM

/usr/lib/terminfo 文件或目录下能找到终端定义格式文件


#include <term.h>

// 首先要设置终端类型
// 将当前终端设置为参数term指向的值,为空使用环境变量$TERM的值。文件描述符fd用于向终端写数据。若参数errret不是空指针则返回值保存在指向的整形变量中
// 返回 -1 terminfo数据库不存在  0 数据库中没有匹配数据项 1 成功
int setupterm(char *term, int fd, int *errret);

int tigetflag(char *capname);
int tigetnum(char *capname);
char *tigetstr(char *capname);



posted @ 2022-06-16 09:39  某某人8265  阅读(81)  评论(0编辑  收藏  举报