码迷,mamicode.com
首页 > 其他好文 > 详细

APUE: 终端相关库函数

时间:2015-01-21 15:18:51      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:gnu   glibc   linux   posix   terminal   

本文主要根据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*

linuxpty就是: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]; // 特殊控制字符

};


NCCSposix中一般是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


未完待续......

APUE: 终端相关库函数

标签:gnu   glibc   linux   posix   terminal   

原文地址:http://blog.csdn.net/wowotouweizi/article/details/42967679

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!