前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >18(终端IO)和19(伪终端)

18(终端IO)和19(伪终端)

作者头像
提莫队长
发布2019-02-21 10:44:24
1K0
发布2019-02-21 10:44:24
举报
文章被收录于专栏:刘晓杰刘晓杰

终端IO有两种不同的工作模式: (1)规范模式输入处理。终端输入以行为单位进行处理 (2)非规范模式输入处理。输入字符不组成行

1 获得和设置终端属性

使用函数tcgetattr和tcsetattr可以获得或设置termios结构。这样也可以检测和修改各种终端选择标志和特殊字符,以使终端按照我们所希望的方式进行操作

代码语言:javascript
复制
#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可以指定下列常量中的某一个:

  1. TCSANOW 更改立即发生
  2. TCSADRAIN 发送了所有输出后更改才发生。可以用来更改输出参数
  3. TCSAFLUSH 发送了所有输出后更改才发生。在更改发生时未读的所有输入数据都被删除

2 打开伪终端设备

代码语言:javascript
复制
#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以防止主设备成为调用者的控制终端

代码语言:javascript
复制
#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主设备,后者打开相应的从设备

代码语言:javascript
复制
#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(主从设备),创建子进程并使其具有控制终端。

代码语言:javascript
复制
#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。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 获得和设置终端属性
  • 2 打开伪终端设备
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档