- 浏览: 140219 次
文章分类
最新评论
tcgetattr 和 tcsetattr 函数可以分别获取和设置 termios 结构,这样就可以检测和修改各种终端选项标志和特殊字符。
其中指向 termios 结构的指针参数 termptr 或者返回当前终端的属性,或者设置该终端的属性。这两个函数只对终端设备进行操作,若 fd 参数没有引用终端设备,则出错返回 -1,并将 errno 设置为 ENOTTY。
tcsetattr 的参数 opt 可以指定新的终端属性何时起作用。它支持以下几个常量。
* TCSANOW:更改立即发生。
* TCSADRAIN:发送了所有输出后更改才发生。若更改输出参数则应使用此选项。
* TCSAFLUSH:发送了所有输出后更改才发生。更进一步,在更改发生时未读的所有输入数据都被丢弃(冲洗)。
注意,tcsetattr 函数即使未能执行所有要求的动作也会返回 OK,这意味着在调用该函数设置所希望的属性后,需调用 tcgetattr 来检测实际的终端属性与所希望的属性是否有区别。
终端第一次被打开时的属性视具体情况而定。一些系统可能会初始化为具体实现所定义的值,另一些可能会保留并使用最后一次使用终端时的属性值。通过打开一个带有 O_TTY_INIT(见不带缓冲的文件I/O之open)标志的驱动设备,可以确认终端的行为是否遵循标准,这样就能在调用 tcgetattr 时确保初始化 termios 结构中的任何非标准部分,使得在获取和修改终端属性时,终端的表现符合预期。
在终端 I/O 综述一节列出了影响终端的选项标志,其中所有的选项标志(除所谓的屏蔽字标志外)都用一位或多位(设置或清除)表示。屏蔽字标志定义多个位,它们组合在一起,可以定义一组值。屏蔽字标志有一个定义名,每个值也有一个名字。例如,为了设置字符长度,首先用字符长度屏蔽字标志 CSIZE 将表示字符长度的位清 0,然后设置这几个值之一:CS5、CS6、CS7、CS8。
由 Linux 和 Solaris 支持的 6 个延迟值也有屏蔽字标志:BSDLY、CRDLY、FFDLY、NLDLY、TABDLY 和 VTADLY。在所有情况下,延迟屏蔽字为 0 就表示没有延迟。如果指定了延迟,则由 OFILL 和 OFDEL 标志决定是由驱动器进行实际延迟还是只传输填充字符。
下面这个程序演示了如何使用这些屏蔽字标志取一个值或者设置一个值。
下面是按字母顺序对终端 I/O 综述中列出的所有终端选项标志的详细说明,同时也指出了它们所属的终端标志字段以及支持的平台。
#include <termios.h> int tcgetattr(int fd, struct termios *termptr); int tcsetattr(int fd, int opt, const struct termios *termptr); /* 两个函数的返回值:若成功,返回 0;否则,返回 -1 */
其中指向 termios 结构的指针参数 termptr 或者返回当前终端的属性,或者设置该终端的属性。这两个函数只对终端设备进行操作,若 fd 参数没有引用终端设备,则出错返回 -1,并将 errno 设置为 ENOTTY。
tcsetattr 的参数 opt 可以指定新的终端属性何时起作用。它支持以下几个常量。
* TCSANOW:更改立即发生。
* TCSADRAIN:发送了所有输出后更改才发生。若更改输出参数则应使用此选项。
* TCSAFLUSH:发送了所有输出后更改才发生。更进一步,在更改发生时未读的所有输入数据都被丢弃(冲洗)。
注意,tcsetattr 函数即使未能执行所有要求的动作也会返回 OK,这意味着在调用该函数设置所希望的属性后,需调用 tcgetattr 来检测实际的终端属性与所希望的属性是否有区别。
终端第一次被打开时的属性视具体情况而定。一些系统可能会初始化为具体实现所定义的值,另一些可能会保留并使用最后一次使用终端时的属性值。通过打开一个带有 O_TTY_INIT(见不带缓冲的文件I/O之open)标志的驱动设备,可以确认终端的行为是否遵循标准,这样就能在调用 tcgetattr 时确保初始化 termios 结构中的任何非标准部分,使得在获取和修改终端属性时,终端的表现符合预期。
在终端 I/O 综述一节列出了影响终端的选项标志,其中所有的选项标志(除所谓的屏蔽字标志外)都用一位或多位(设置或清除)表示。屏蔽字标志定义多个位,它们组合在一起,可以定义一组值。屏蔽字标志有一个定义名,每个值也有一个名字。例如,为了设置字符长度,首先用字符长度屏蔽字标志 CSIZE 将表示字符长度的位清 0,然后设置这几个值之一:CS5、CS6、CS7、CS8。
由 Linux 和 Solaris 支持的 6 个延迟值也有屏蔽字标志:BSDLY、CRDLY、FFDLY、NLDLY、TABDLY 和 VTADLY。在所有情况下,延迟屏蔽字为 0 就表示没有延迟。如果指定了延迟,则由 OFILL 和 OFDEL 标志决定是由驱动器进行实际延迟还是只传输填充字符。
下面这个程序演示了如何使用这些屏蔽字标志取一个值或者设置一个值。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <termios.h> int main(void){ struct termios term; if(tcgetattr(STDIN_FILENO, &term) < 0){ printf("tcgetattr error\n"); exit(1); } switch(term.c_cflag & CSIZE){ case CS5: printf("5 bits/byte\n"); break; case CS6: printf("6 bits/byte\n"); break; case CS7: printf("7 bits/byte\n"); break; case CS8: printf("8 bits/byte\n"); break; default: printf("unknown bits/byte\n"); } term.c_cflag &= ~CSIZE; // zero out the bits term.c_cflag |= CS8; // set 8 bits/byte if(tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0){ printf("tcsetattr error\n"); exit(1); } exit(0); }
下面是按字母顺序对终端 I/O 综述中列出的所有终端选项标志的详细说明,同时也指出了它们所属的终端标志字段以及支持的平台。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1246在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1527伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 789多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 934终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 563尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 933虽然大多数终端设 ... -
终端特殊输入字符
2018-05-17 06:33 805终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 430终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 573在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 942在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 612在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 488消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 477有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 409FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 380管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 874readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 447POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 570记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 431UNIX 系统中,守护进程遵循下列通用惯例。 ... -
守护进程编写规则与出错记录
2017-12-26 01:53 449在编写守护进程程 ...
相关推荐
= 0) { /* 获取终端属性 */ perror("tcgetattr"); return 1; } printf("Current terminal settings:\n"); printf("Input Flags: %x\n", options.c_iflag); printf("Output Flags: %x\n", options.c_oflag); ...
`tcsetattr`函数是Linux系统中的一个用于设置终端属性的关键函数,主要应用于软件开发中对终端设备的控制,如控制台交互或者串口通信。它允许程序员改变终端的行为,如输入输出模式、波特率、控制字符等。这个函数...
在STM32WB系列微控制器上开发Zigbee睡眠终端设备时,需要特别注意低功耗模式的设计与优化,以及如何高效地实现数据传输和网络接入。通过合理配置ZbStartupT结构体和利用双向镜像机制,可以构建出既节能又高效的...
18.4 获得和设置终端属性 18.5 终端选项标志 18.6 stty命令 18.7 波特率函数 18.8 行控制函数 18.9 终端标识 18.10 规范模式 18.11 非规范模式 18.12 终端的窗口大小 18.13 termcap,...
这些成员变量和标志位的组合,使得开发者能够精细控制终端的行为,无论是对于串口通信的优化,还是在特定应用环境中对输入输出的定制化需求,都能找到相应的支持。 总之,TERMIOS虽源自旧时代,但在嵌入式开发、...
5. 错误,程序是静态实体,PCB是进程动态属性的表示,两者都是进程存在的标志。 6. 错误,除了释放PCB,还需要释放其他资源。 7. 正确,P-V原语可以用于进程同步和互斥。 8. 错误,简单轮转法不考虑优先级,所有...
18.4 获得和设置终端属性 516 18.5 终端选项标志 516 18.6 stty命令 522 18.7 波特率函数 523 18.8 行控制函数 524 18.9 终端标识 524 18.10 规范模式 529 18.11 非规范模式 532 18.12 终端的窗口...
505 习题 505 第18章 终端I/O 507 18.1 引言 507 18.2 综述 507 18.3 特殊输入字符 512 18.4 获得和设置终端属性 516 18.5 终端选项标志 516 18.6 stty命令 522 18.7 波特率函数 523 18.8 行控制...
18.4 获得和设置终端属性516 18.5 终端选项标志516 18.6 stty命令522 18.7 波特率函数523 18.8 行控制函数524 18.9 终端标识524 18.10 规范模式529 18.11 非规范模式532 18.12 终端的窗口大小537 18.13 ...
18.4 获得和设置终端属性516 18.5 终端选项标志516 18.6 stty命令522 18.7 波特率函数523 18.8 行控制函数524 18.9 终端标识524 18.10 规范模式529 18.11 非规范模式532 18.12 终端的窗口大小537 18.13 ...
25. CAN属性:CAN协议具有报文优先权、保持延迟时间设置灵活性、系统内数据的连贯性和多主机多终端支持等特点。 26. 多主机多终端:这种终端配置方法可以通过不改变终端电缆的DC特性来增强EMC性能,是正确的。 27....
`termios`结构体是Unix/Linux系统中用于配置终端输入输出属性的一个关键数据结构。它允许应用程序控制终端的行为,比如如何处理输入数据、如何格式化输出数据等。下面我们将详细解析`termios`结构体中各个成员的具体...
**功能**:`chattr` 命令用于更改文件属性,特别是在ext文件系统上设置文件的特殊标志。 **语法**: ``` chattr [选项] [文件名] ``` **选项**: - `+i`:设置文件的不可改变标志。 - `-i`:清除文件的不可改变...
2. **设置无线网络属性**:在弹出的“无线网络属性”窗口中,填写一个唯一的“服务设置标志(SSID)”,例如“001”,取消勾选“自动为我提供密钥”,并将数据加密选项设置为“已禁用”。 3. **保存设置**:点击...
在Ubuntu的Nautilus文件管理器中,可以通过右键点击文件夹,选择“属性”,然后在“权限”选项卡中更改权限设置。但这同样不会改变子文件和子文件夹的权限,所以可能需要手动逐个更改。 在执行任何更改权限的操作...
若使用`-o`选项,则按照顺序输出日志文件中的所有条目至标准输出设备,如终端屏幕。 - **记录数据到指定日志文件**:使用`alog -f LogFile`命令时,可以将标准输入的数据写入指定的日志文件中。若结合`-q`标志使用...
这可以通过在工程的属性设置中,选择“C编译器”和“C++编译器”的“工具标志”来实现。 完成代码编写后,执行“重建项目”以编译整个工程。编译成功后,便进入了调试阶段。在Workbench中,选择“目标”->“新建...