APUE: 终端相关库函数

本文主要根据APUE总结了和终端/伪终端相关的函数。

记录终端信息的两个资料库:

termcap:源于BSD,老版本。

terminfo”源于systemV,新版本,已取代termcap。

echo $TERM
可以查看当前终端

infocmp $yourterm
查看资料库中你的终端的信息

stty -a #查看termios结构的情况

posix定义的在输入时的做特殊处理的11个字符:

CR \R
回车,不能更改

NL \N
换行,不能更改

EOF ^D
文件结束

INTR ^C
中断信号

SUSP ^Z
挂起信号

QUIT ^退出信号

EOL
行结束

ERASE ^H
向前擦除一个字符

KILL ^U
擦行

START ^Q
恢复输出

STOP ^S
停止输出

伪终端PTY就是对应用程序它看起来像终端,实际它并不是一个真正的终端,伪终端通常是成对出现。

伪终端作用:

1.构造网络登陆服务器

2.script程序

3.expect程序

4.运行协同进程

5.观看长时间运行程序的输出

linux的终端就是:tty*

linux的pty就是:ptmx+
pts*

#####################################################

终端相关库函数

#####################################################

#include<termios.h>

#include<unistd.h>

可以检测和更改的终端设备特性都包含在termios结构中:

输入模式

输出模式

控制模式

本地模式

特殊控制字符

structtermios
{

tcflag_tc_iflag; //输入

tcflag_tc_oflag; //输出

tcflag_tc_cflag; //控制

tcflag_tc_lflag; //本地

cc_t c_cc[NCCS]; //
特殊控制字符

};

NCCS在posix中一般是11个,linux扩展为32个。

在下面名字前面加V用来做c_cc数组下标。

CR \R
回车,不能更改

NL \N
换行,不能更改

EOF ^D
文件结束

INTR ^C
中断信号

SUSP ^Z
挂起信号

QUIT ^退出信号

EOL
行结束

ERASE ^H
向前擦除一个字符

KILL ^U
擦行

START ^Q
恢复输出

STOP ^S
停止输出

终端属性操作,成功返回0,失败返回-1.

inttcgetattr(int fd, struct termios *termios_p);

获取终端属性。

inttcsetattr(int fd, int optional_action, const struct termios*termios_p);

设置终端属性。

opt:指定设置的终端属性什么时候起作用。

TCSANOW:更改立即发生

TCSADRAIN:发送了所有输出后更改才发生,用于更改输出参数。

TCSAFLUSH:发送了所有输出后更改才发生,在更改发生时未读的所有数据都被删除。

行控制函数:

inttcdrain(int fd);

等待所有输出都被发送。

inttcsendbreak(int fd, int duration);

在指定时间区间发送连续0位流。

duration=0:发送延续0.25-0.5秒。

inttcflow(int fd, int action);

用于对输入和输出流控制进行控制。

action:

TCOOFF:输出被挂起

TCOON:重新启动以前被挂起的输出。

TCIOFF:系统发送一个STOP字符,使终端设备暂停发送数据。

TCION:系统发送一个START字符,使终端恢复发送数据。

inttcflush(int fd, int queue_selector);

发送输入缓冲区和输出缓冲区中未决的数据。

queue_selector:

TCIFLUSH:刷清输入队列

TCOFLUSH:刷清输出队列

TCIOFLUSH:刷清输入、输出队列

波特率相关函数:

speed_tcfgetispeed(const struct termios *termios_p);

speed_tcfgetospeed(const struct termios *termios_P);

返回输入/输出的波特率。

intcfsetispeed(struct termios *termios_p, speed_t speed);

intcfsetospeed(struct termios *termios_p, speed_t speed);

设置输入/输出速度,成功返回0,失败返回-1.

speed:取下列值,参考手册。

B50\B75\B110\B134\B150\B200\B300\B600\B1200\B1800\B2400...

B0:禁用调制调节器的控制线。

前台进程组ID:

pid_ttcgetsid(int fd);

返回会话首进程的进程组ID,失败返回-1.

pid_ttcgetpgrp(int fd);

返回前台进程组的进程组ID,出错返回-1.

inttcsetpgrp(int fd, pid_t pgrp);

设置前台进程组ID,成功返回0,失败返回-1.

#####################################################

终端相关的其它库函数

#####################################################

#include<unistd.h>

intisatty(int fd);

测试文件描述符是否指向终端。是返回1,否返回0.

char*ttyname(int fd);

返回指向终端路径名的指针,出错返回NULL。

#include<stdio.h>

char*ctermid(char *s);

成功返回指向控制终端名的指针,出错返回指向空字符串的指针。

如果s非空和返回值相同。

#####################################################

伪终端相关的库函数

#####################################################

#include<stdlib.h>

#include<fcntl.h>

intposix_openpt(intflags);

打开一个伪终端主设备,成功返回下一个可用的pty主设备的文件描述符,失败返回-1.

flags:

O_RDWR:打开伪终端用于读写,一般使用这个标识。

O_NOCTTY:防止伪终端设备成为调用进程的控制终端。

intgrantpt(int fd);

给伪终端从设备授权,成功返回0,失败返回-1.

intunlockpt(int fd);

解锁伪终端主从设备对,使得伪终端设备可以被访问。

char*ptsname(int fd);

获取伪终端从设备的名称,成功返回指向pty从设备名的指针,失败返回NULL。

未完待续......

时间: 2024-10-04 21:41:41

APUE: 终端相关库函数的相关文章

APUE: 线程相关库函数

线程有时称为轻权进程. 进程的所有信息对该进程的所有线程都是共享的. 每个线程有一个线程ID,线程ID只在它所属的进程环境中有效. 线程从进程继承的东西: 进程ID 地址空间 浮点环境 信号屏蔽字(不包括未决的信号集) 线程间共享的东西: 进程指令 大部分数据 信号处理程序和信号处理 当前工作目录 用户ID和组ID 线程间独立的东西: 线程ID 寄存器集合 栈 errno 信号掩码 优先级 所有线程函数返回类型为int的成功返回0,失败返回错误码,不设置errno. 线程编程需要链接库: -lp

APUE: 进程相关的系统调用和库函数

进程正常终止5种方式: 1.main函数返回 2.调用exit库函数 3.调用_exit或_Exit系统调用 4.最后一个线程从其启动例程返回 5.最后一个线程调用pthread_exit库函数 进程异常终止3种方式: 1.调用abort库函数,产生abort信号. 2.接到一个信号并终止 3.最后一个线程对取消请求做出响应 init进程:pid=1的进程,如果父进程先于子进程终止,子进程就被init进程收养. 孤儿进程:父进程先于子进程退出,子进程被init进程收养,这个子进程就是孤儿进程.

APUE: 信号相关系统调用和库函数

信号就是软件中断,信号提供一种处理异步事件的方法. 信号出现时按照下列方式处理: 1.忽略此信号,有两个信号不能忽略. 2.捕捉此信号,有两个信号不能被捕捉. 3.默认处理,少数默认处理是忽略,大部分默认处理是终止. ctrl+D组合键,不是信号,只是EOF字符 linux中1-31为普通信号:34-64为实时信号. trap-l 命令查看所有信号,64个 信号从1开始,没有0. SIGHUP:终端接口检测到连接断开发出该信号, SIGINT:ctrl+c,终端中断符,一般用来停止一个失去控制的

APUE: 系统相关的系统调用和库函数

本文主要总结和系统相关的文件和信息的系统调用和库函数. ####################################################### 系统相关的系统调用 ####################################################### #include <sys/types.h> #include <unistd.h> int getgroups(int size, gid_t list[]); 获取附加组ID,成功返

终端相关

终端的相关命令: <1>ls ,(list)显示当前文件夹下的所有可见文件 10M:~ qianfeng$ ls ~ ,表示当前文件夹(当前用户所在的文件夹) <2>ls -a , (list all)显示当前文件夹下的所有文件 10M:~ qianfeng$ ls -a <3>ls -l, 以详细信息的方式显示所有可见文件 10M:~ qianfeng$ ls -l <4>mkdir , 新建文件夹 10M:~ qianfeng$ mkdir qianfe

UART 串口相关库函数

先把一般使用时候用到的几个串口库函数列出来. 以下是串口初始化的一个参考函数: void uart_init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; //对GPIO进行配置 USART_InitTypeDef USART_InitStructure; //对串口进行配置 NVIC_InitTypeDef NVIC_InitStructure; //对串口中断进行配置 RCC_AHB1PeriphClockCmd(RCC_AHB1Perip

linux 相关库函数与系统调用动态实现

//库函数 void Memset(void *mem, unsigned char byte, unsigned int len); void _memcpy(void *, void *, unsigned int); int _printf(char *, ...); char * itoa(long, char *); char * itox(long, char *); int _puts(char *); int _puts_nl(char *); size_t _strlen(ch

Linux终端概念及相关命令

Linux中终端的概念: 在使用Linux操作系统的过程中,我们可以通过终端(terminal)来输入命令和接收信息,用户如果想与计算机进行交互,就会使用到终端,所以说,显示器和键盘就是一种终端,我们接收显示器输出的信息,通过键盘向电脑输入信息,显示器和键盘是真实存在的物理设备,我们可以称之为物理终端. 刚才提到物理终端,除了物理终端,还有虚拟终端.图形终端.模拟终端等终端类型. 虚拟终端:虚拟终端是基于物理终端之上,以软件的方式虚拟实现的终端,虚拟终端称之为tty,我们可以在同一个物理终端上虚

APUE学习总结

引言 该文档由个人总结,一级标题的序号对应<APUE>第一版的各章,但是二级标题和该书无关,其序号和内容完全是根据个人判断和个人需求进行编写. 3.文件I/O 本章所说明的函数经常被称之为不带缓存的I/O(与第5章中说明的标准I/O函数相对照) 3.1文件I/O函数 大多数UNIX文件I/O只需用到5个函数:open.read.write.lseek.close. 需注意的是write后如需要read,则需要在read前添加lseek,因为write后文件的偏移量在write的最后一个位置(而