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. strcpy(sptyname, pName);
  34. printf( "my sptyname is %s/n" ,sptyname);
  35. //test write to mpty and read from spty*************
  36. char temp[50] = { "hell/nworld ! i have write to mpty!" };
  37. char temp2[100] = { '/0' };
  38. c = write(mpty,temp,5);
  39. if (c <=0)
  40. printf( "ERROR : can not write to mpty/n" );
  41. sleep(3);
  42. printf( "write %d charactors to mpty success/n" ,c);
  43. sleep(3);
  44. printf( "try to read from spty/n" );
  45. sleep(3);
  46. c = read(spty,temp2,5);
  47. if (c <=0)
  48. printf( "ERROR : can not read from mpty/n" );
  49. printf( "read from spty  %d charactors success/n" ,c);
  50. printf( "/n>>>>>  %s  <<<<</n/n___________________/n" ,temp2);
  51. //**************************************************
  52. // Go into loop and read what is sent to Slave side of pair
  53. while (1)
  54. {
  55. c = read(mpty, ptyBuff, 100);
  56. if (c > 0)
  57. {
  58. printf( "###-<%d>/n" , c);
  59. printf( "buff:__|%s" ,ptyBuff);
  60. }
  61. }
  62. }
  63. else
  64. {
  65. printf( "PseudoTerm, creation failed.../n" );
  66. }
  67. return rtnVal;
  68. } http: //blog.163.com/coder_jack@126
  69. 伪终端的操作:
  70. 以下是源码,来自/fsl_myandroid_r6/external/qemu/vl.c   line 2545
  71. r7里面都已经没有了!真快呀!哈哈
  72. /* Once Solaris has openpty(), this is going to be removed. */
  73. int openpty( int *amaster, int *aslave, char *name,
  74. struct termios *termp, struct winsize *winp)
  75. {
  76. const char *slave;
  77. int mfd = -1, sfd = -1;
  78. *amaster = *aslave = -1;
  79. mfd = open( "/dev/ptmx" , O_RDWR | O_NOCTTY);
  80. if (mfd < 0)
  81. goto err;
  82. if (grantpt(mfd) == -1 || unlockpt(mfd) == -1)
  83. goto err;
  84. if ((slave = ptsname(mfd)) == NULL)
  85. goto err;
  86. if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1)
  87. goto err;
  88. if (ioctl(sfd, I_PUSH, "ptem" ) == -1 ||
  89. (termp != NULL && tcgetattr(sfd, termp) < 0))
  90. goto err;
  91. if (amaster)
  92. *amaster = mfd;
  93. if (aslave)
  94. *aslave = sfd;
  95. if (winp)
  96. ioctl(sfd, TIOCSWINSZ, winp);
  97. return 0;
  98. err:
  99. if (sfd != -1)
  100. close(sfd);
  101. close(mfd);
  102. return -1;
  103. } http: //blog.163.com/coder_jack@126
[cpp] view plain copy如何操作伪终端:  伪终端的使用是成对出现的,分为master 和 slaver  主设备:/dev/ptmx (i850上的主设备名)  从设备:动态生成:/dev/pts/0.......x  功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。
各种平台打开 终端 设备的方法有所不同。在Single UNIX Specification的XSI扩展 包含了很多函数,试图统一这些方法。这些函数的基础是SVR4用于管理基于STREAMS的 终端 的一组函数。  posix_openpt用来打开下一个可用的 终端 主设备,该函数是可移植的。 #include &lt;stdlib.h&gt; #include &lt;fcntl.h&gt;...
终端 和运行的程序之间有一个 终端 行规程(见http://www.cnblogs.com/nufangrensheng/p/3575752.html 的图18-2),通过它我们能够在 终端 上设置特殊字符(退格、行删除、 断等)。但是,当一个登陆请求到达网络连接时, 终端 行规程并不是自动被加载到网络连接和登陆程序shell之间的。 终端 这个术语暗示对于一个应用程序而言,它看上去像一个终... 1.通常一个进程打开 终端 主设备,然后调用fork。子进程建立了一个新的会话,打开一个相应的 终端 从设备,将其文件 描述符复制到标准输入、标准输出和标准出错,然后调用exec。 终端 从设备成为子进程的控制 终端 。 2.对于 终端 从设备之上的用户进程
终端 就是指,一个应用程序看上去像一个 终端 ,但事实上它并不是个真正的 终端 。下图显示了使用 终端 时相关进程的典型安排。 [img]http://dl2.iteye.com/upload/attachment/0129/9523/81165c3d-0144-3e08-bb9d-dc8a16b4ccc9.png[/img] 图 的关键点如下。 1、通常,一个进程打开 终端 主...
p align="JUSTIFY">19.3 打开 终端 设备   在SVR4和4.3+BSD系统 打开 终端 设备的方法有所不同。我们提供两个函数来处理所有细节: pty m_open用来打开下一个有效的 终端 主设备, pty s_open用来打开相应的从设备。 #include ourhdr.h int pty m_open(char *pts_name);   返回:如果操作成功
通常,一个进程打开 终端 主设备,然后调用fork,子进程建立一个新的会话,打开一个相应的 终端 从设备,将其文件描述符复制到stdin、stdout、stderr。然后调用exec执行新程序。 终端 从设备成为了子进程的控制 终端 。 对于 终端 从设备上的用户进程来说,其stdin、stdout、stderr都是 终端 设备。通过这些描述符,用户进程能够处理第18章 的所有 终端 I/O
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的 编程 任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络 编程 等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的 编程 语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示 更有效地传达信息。 1. 打开 终端 应用程序。 2. 输入命令“bash”或“sh”,然后按Enter键。这将使您进入Bash或Shell 编程 界面。 3. 您可以开始编写shell脚本或在该界面 执行各种命令。 如果您想退出shell 编程 界面,可以输入命令“exit”或“logout”,然后按Enter键即可。