18(终端IO)和19(伪终端)
2016-04-25 15:46
351 查看
终端IO有两种不同的工作模式:
(1)规范模式输入处理。终端输入以行为单位进行处理
(2)非规范模式输入处理。输入字符不组成行
Termios结构返回或者设置当前终端的属性。
Opt可以指定下列常量中的某一个:
TCSANOW 更改立即发生
TCSADRAIN 发送了所有输出后更改才发生。可以用来更改输出参数
TCSAFLUSH 发送了所有输出后更改才发生。在更改发生时未读的所有输入数据都被删除
参数oflag是一个位屏蔽字,指定如何打开主设备。
oflag=O_RDWR,要求打开主设备进行读写,
oflag=O_NOCTTY以防止主设备成为调用者的控制终端
ptym_open和ptys_open。前者打开下一个可用的pty主设备,后者打开相应的从设备
pty_fork函数
我们现在使用前面的两个函数ptym_open和ptys_open来写一个新的函数pty_fork。这个新的函数将在fork的时候同时打开master和slave(主从设备),创建子进程并使其具有控制终端。
PTY 主设备的文件描述符号通过ptrfdm指针返回。
如果slave_name非空,那么slave设备的名称会被存放在其中,调用者需要为这个参数指向的指针分配空间。
如果指针slave_termios非空,那么系统使用这个引用的结构来初始化slave的终端行规程。如果这个指针为空,那么系统设置slave的termios结构为系统定义的初始状态。类似,如果slave_winsize指针非空的时候,就用其引用的结构来初始化slave的窗口大小,如果这个指针为空,那么一般会将窗口大小的结构初始化为0。
(1)规范模式输入处理。终端输入以行为单位进行处理
(2)非规范模式输入处理。输入字符不组成行
1 获得和设置终端属性
使用函数tcgetattr和tcsetattr可以获得或设置termios结构。这样也可以检测和修改各种终端选择标志和特殊字符,以使终端按照我们所希望的方式进行操作#include <termios.h> int tcgetattr(int filedes, struct termios *termptr); int tcsetattr(int filedes, int opt, const struct termios *termptr); Both return: 0 if OK, 1 on error
Termios结构返回或者设置当前终端的属性。
Opt可以指定下列常量中的某一个:
TCSANOW 更改立即发生
TCSADRAIN 发送了所有输出后更改才发生。可以用来更改输出参数
TCSAFLUSH 发送了所有输出后更改才发生。在更改发生时未读的所有输入数据都被删除
2 打开伪终端设备
#include <stdlib.h> #include <fcntl.h> int posix_openpt(int oflag); Returns: file descriptor of next available PTY master if OK, -1 on error
参数oflag是一个位屏蔽字,指定如何打开主设备。
oflag=O_RDWR,要求打开主设备进行读写,
oflag=O_NOCTTY以防止主设备成为调用者的控制终端
#include <stdlib.h> int grantpt(int filedes); int unlockpt(int filedes); Both return: 0 on success, 1 on error //grantpt可以设置终端权限:对单个所有者是读/写,对组所有者是写(0620) //unlockpt函数准予对伪终端从设备的访问,从而允许应用程序打开该设备。 #include <stdlib.h> char *ptsname(int filedes); Returns: pointer to name of PTY slave if OK, NULL on error //ptsname可以返回指向伪终端的从设备名的指针
ptym_open和ptys_open。前者打开下一个可用的pty主设备,后者打开相应的从设备
#include "apue.h" int ptym_open(char *pts_name, int pts_namesz); Returns: file descriptor of PTY master if OK, 1 on error int ptys_open(char *pts_name); Returns: file descriptor of PTY slave if OK, 1 on error //pts_namesz表示缓冲区长度
pty_fork函数
我们现在使用前面的两个函数ptym_open和ptys_open来写一个新的函数pty_fork。这个新的函数将在fork的时候同时打开master和slave(主从设备),创建子进程并使其具有控制终端。
#include "apue.h" #include <termios.h> #include <sys/ioctl.h> /* find struct winsize on BSD systems */ pid_t pty_fork(int *ptrfdm, char *slave_name, int slave_namesz, const struct termios *slave_termios, const struct winsize *slave_winsize); Returns: 0 in child, process ID of child in parent, -1 on error
PTY 主设备的文件描述符号通过ptrfdm指针返回。
如果slave_name非空,那么slave设备的名称会被存放在其中,调用者需要为这个参数指向的指针分配空间。
如果指针slave_termios非空,那么系统使用这个引用的结构来初始化slave的终端行规程。如果这个指针为空,那么系统设置slave的termios结构为系统定义的初始状态。类似,如果slave_winsize指针非空的时候,就用其引用的结构来初始化slave的窗口大小,如果这个指针为空,那么一般会将窗口大小的结构初始化为0。
相关文章推荐
- 万物互联时代的数据中心
- NSNotification-iOS初学
- iOS每日一记之-------------------获取label的行数。。。。。恩
- centos 源码安装Nginx
- C#编程总结(九)字符编码
- 学习进度条六(第七周)
- 直播源格式转换教程——rtmp/rtsp/http/m3u8!!
- 一、配置自己的markdown编辑器
- 初学webapi时遇到的奇葩问题
- JSP注入攻击tomcat服务器小案例
- 剑指offer之面试题19:二叉树的镜像
- mysql服务器查询慢原因分析方法
- IAR 调试 CC2530
- ElasticSearch 概念解析
- mysql服务器查询慢原因分析方法
- oracle-2中commit 详解
- 用premake5创建lua532工程
- Django ValidationError中的单下划线
- 关于iOS定位问题
- iis配置站点,页面中的video 视频标签加载的视频无法播放或者无法加载的解决方法