Linux中的伪终端编程_pty.h-程序员宅基地

技术标签: Linux  

[cpp]  view plain   copy
  1. 如何操作伪终端:  
  2. 伪终端的使用是成对出现的,分为master 和 slaver  
  3. 主设备:/dev/ptmx (i850上的主设备名)  
  4. 从设备:动态生成:/dev/pts/0.......x  
  5. 功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。  
  6. 以下是测试代码  
  7. Ubuntu 下的编译方法:  
  8. gcc -Wall ptyhost.c -o ptyhost -util /lib/libutil-2.9.so  
  9. # include <stdio.h>  
  10. # include <stdlib.h>  
  11. # include <string.h>  
  12. # include <unistd.h>  
  13. # include <sys/types.h>  
  14. # include <linux/limits.h>  
  15. # include <pty.h> /* for openpty and forkpty */  
  16. #include <utmp.h> /* for login_tty */  
  17. #include <time.h>  
  18. # include <pty.h> /* for openpty and forkpty */  
  19. #include <utmp.h> /* for login_tty */  
  20. int main(int argc, char *argv[])  
  21. {  
  22.         int rtnVal=0;  
  23.         int mpty, spty, c=0, dev=0;  
  24.         char *pName=NULL;  
  25.         char ptyBuff[100] = { '/0'};  
  26.         char sptyname[20] = { '/0'};  
  27.         rtnVal = openpty(&mpty, &spty, sptyname, NULL, NULL);/*该函数遍历系统中的伪终端匹配对,如果能找到一组未使用的,则返回1,否则返回-1,成功返回时mpty会带出匹配对中主设备的文件描述符,spty会带出从设备的文件描述符,第三个实参如果不空的话,它会带出从设备的路径名!后边两个参数是在设置终端属性,一般是不要的,据说伪终端对属性设置是忽略的*/  
  28.         // Check if Pseudo-Term pair was created  
  29.         if(rtnVal != -1)  
  30.         {  
  31.                 pName = ptsname(mpty);//get slave device name, the arg is the master device  
  32.                 printf("Name of slave side is <%s>    fd = %d/n", pName, spty);  
  33.                  
  34.                 strcpy(sptyname, pName);  
  35.                 printf("my sptyname is %s/n",sptyname);  
  36. //test write to mpty and read from spty*************  
  37. char temp[50] = { "hell/nworld ! i have write to mpty!"};  
  38. char temp2[100] = { '/0'};  
  39. c = write(mpty,temp,5);  
  40. if(c <=0)  
  41.         printf("ERROR : can not write to mpty/n");  
  42. sleep(3);  
  43. printf("write %d charactors to mpty success/n",c);  
  44. sleep(3);  
  45. printf("try to read from spty/n");  
  46. sleep(3);  
  47. c = read(spty,temp2,5);  
  48. if(c <=0)  
  49.         printf("ERROR : can not read from mpty/n");  
  50. printf("read from spty  %d charactors success/n",c);  
  51. printf("/n>>>>>  %s  <<<<</n/n___________________/n",temp2);  
  52. //**************************************************  
  53.   
  54.                 // Go into loop and read what is sent to Slave side of pair  
  55.                 while(1)  
  56.                 {  
  57.                         c = read(mpty, ptyBuff, 100);  
  58.                         if(c > 0)  
  59.                         {  
  60.                                 printf("###-<%d>/n", c);  
  61.                                 printf("buff:__|%s",ptyBuff);  
  62.                         }  
  63.                 }  
  64.         }  
  65.          
  66.         else  
  67.         {  
  68.                 printf("PseudoTerm, creation failed.../n");  
  69.         }  
  70.         return rtnVal;  
  71. } http://blog.163.com/coder_jack@126  
  72.   
  73. 伪终端的操作:  
  74. 以下是源码,来自/fsl_myandroid_r6/external/qemu/vl.c   line 2545  
  75. r7里面都已经没有了!真快呀!哈哈  
  76. /* Once Solaris has openpty(), this is going to be removed. */  
  77. int openpty(int *amaster, int *aslave, char *name,  
  78.             struct termios *termp, struct winsize *winp)  
  79. {  
  80.         const char *slave;  
  81.         int mfd = -1, sfd = -1;  
  82.         *amaster = *aslave = -1;  
  83.         mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY);  
  84.         if (mfd < 0)  
  85.                 goto err;  
  86.         if (grantpt(mfd) == -1 || unlockpt(mfd) == -1)  
  87.                 goto err;  
  88.         if ((slave = ptsname(mfd)) == NULL)  
  89.                 goto err;  
  90.         if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1)  
  91.                 goto err;  
  92.         if (ioctl(sfd, I_PUSH, "ptem") == -1 ||  
  93.             (termp != NULL && tcgetattr(sfd, termp) < 0))  
  94.                 goto err;  
  95.         if (amaster)  
  96.                 *amaster = mfd;  
  97.         if (aslave)  
  98.                 *aslave = sfd;  
  99.         if (winp)  
  100.                 ioctl(sfd, TIOCSWINSZ, winp);  
  101.         return 0;  
  102. err:  
  103.         if (sfd != -1)  
  104.                 close(sfd);  
  105.         close(mfd);  
  106.         return -1;  
  107. } http://blog.163.com/coder_jack@126  

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/eydwyz/article/details/52218573

智能推荐

5个超厉害的资源搜索网站,每一款都可以让你的资源满满!_最全资源搜索引擎-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏41次。生活中我们无时不刻不都要在网站搜索资源,但就是缺少一个趁手的资源搜索网站,如果有一个比较好的资源搜索网站可以帮助我们节省一大半时间!今天小编在这里为大家分享5款超厉害的资源搜索网站,每一款都可以让你的资源丰富精彩!网盘传奇一款最有效的网盘资源搜索网站你还在为找网站里面的资源而烦恼找不到什么合适的工具而烦恼吗?这款网站传奇网站汇聚了4853w个资源,并且它每一天都会持续更新资源;..._最全资源搜索引擎

Book类的设计(Java)_6-1 book类的设计java-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏18次。阅读测试程序,设计一个Book类。函数接口定义:class Book{}该类有 四个私有属性 分别是 书籍名称、 价格、 作者、 出版年份,以及相应的set 与get方法;该类有一个含有四个参数的构造方法,这四个参数依次是 书籍名称、 价格、 作者、 出版年份 。裁判测试程序样例:import java.util.*;public class Main { public static void main(String[] args) { List <Book>_6-1 book类的设计java

基于微信小程序的校园导航小程序设计与实现_校园导航微信小程序系统的设计与实现-程序员宅基地

文章浏览阅读613次,点赞28次,收藏27次。相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了校园导航的标准化、制度化、程序化的管理,有效地防止了校园导航的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正建筑速看等信息。课题主要采用微信小程序、SpringBoot架构技术,前端以小程序页面呈现给学生,结合后台java语言使页面更加完善,后台使用MySQL数据库进行数据存储。微信小程序主要包括学生信息、校园简介、建筑速看、系统信息等功能,从而实现智能化的管理方式,提高工作效率。

有状态和无状态登录

传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。有状态和无状态最大的区别就是服务端会不会保存客户端的信息。

九大角度全方位对比Android、iOS开发_ios 开发角度-程序员宅基地

文章浏览阅读784次。发表于10小时前| 2674次阅读| 来源TechCrunch| 19 条评论| 作者Jon EvansiOSAndroid应用开发产品编程语言JavaObjective-C摘要:即便Android市场份额已经超过80%,对于开发者来说,使用哪一个平台做开发仍然很难选择。本文从开发环境、配置、UX设计、语言、API、网络、分享、碎片化、发布等九个方面把Android和iOS_ios 开发角度

搜索引擎的发展历史

搜索引擎的发展历史可以追溯到20世纪90年代初,随着互联网的快速发展和信息量的急剧增加,人们开始感受到了获取和管理信息的挑战。这些阶段展示了搜索引擎在技术和商业模式上的不断演进,以满足用户对信息获取的不断增长的需求。

随便推点

控制对象的特性_控制对象特性-程序员宅基地

文章浏览阅读990次。对象特性是指控制对象的输出参数和输入参数之间的相互作用规律。放大系数K描述控制对象特性的静态特性参数。它的意义是:输出量的变化量和输入量的变化量之比。时间常数T当输入量发生变化后,所引起输出量变化的快慢。(动态参数) ..._控制对象特性

FRP搭建内网穿透(亲测有效)_locyanfrp-程序员宅基地

文章浏览阅读5.7w次,点赞50次,收藏276次。FRP搭建内网穿透1.概述:frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。2.简单的图解:3.准备工作:1.一个域名(www.test.xyz)2.一台有公网IP的服务器(阿里云、腾讯云等都行)3.一台内网主机4.下载frp,选择适合的版本下载解压如下:我这里服务器端和客户端都放在了/usr/local/frp/目录下4.执行命令# 服务器端给执_locyanfrp

UVA 12534 - Binary Matrix 2 (网络流‘最小费用最大流’ZKW)_uva12534-程序员宅基地

文章浏览阅读687次。题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93745#problem/A题意:给出r*c的01矩阵,可以翻转格子使得0表成1,1变成0,求出最小的步数使得每一行中1的个数相等,每一列中1的个数相等。思路:网络流。容量可以保证每一行和每一列的1的个数相等,费用可以算出最小步数。行向列建边,如果该格子是_uva12534

免费SSL证书_csdn alphassl免费申请-程序员宅基地

文章浏览阅读504次。1、Let's Encrypt 90天,支持泛域名2、Buypass:https://www.buypass.com/ssl/resources/go-ssl-technical-specification6个月,单域名3、AlwaysOnSLL:https://alwaysonssl.com/ 1年,单域名 可参考蜗牛(wn789)4、TrustAsia5、Alpha..._csdn alphassl免费申请

测试算法的性能(以选择排序为例)_算法性能测试-程序员宅基地

文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试

Lane Detection_lanedetectionlite-程序员宅基地

文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite

推荐文章

热门文章

相关标签