apac_command.c  do_remotecmddev  -- forkpty,,,,,,,,pppd   get_pty  -- mfd = open( "/dev/ptmx" , O_RDWR | O_NOCTTY);

// 执行脚本 #define eval(cmd, args...)

  1. 如何操作伪终端:
  2. 伪终端的使用是成对出现的,分为master 和 slaver
  3. 主设备:/dev/ptmx (i850上的主设备名)
  4. 从设备:动态生成:/dev/pts/0.......x
  5. 功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。
  6. 以下是<a href= "http://lib.csdn.net/base/softwaretest" class = 'replace_word' title= "软件测试知识库" target= '_blank' style= 'color:#df3434; font-weight:bold;' >测试</a>代码
  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 <<a href="http://lib.csdn.net/base/linux" class='replace_word' title="Linux知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Linux</a>/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. // <a href="http://lib.csdn.net/base/go" class='replace_word' title="Go知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Go</a> 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

1.telnet client通过connect连接telnet server

2.telnet server 调用accept接受连接请求,并fork子进程1处理与client之间的连接。同时打开伪终端主设备

3.子进程1再fork子进程调用login,同时打开伪终端从设备

4.login处理完验证等处理后,exec登陆shell

5.登陆shell利用伪终端从设备和子进程1之间进行通信

下面是打开伪终端的代码:

ptym_open用于打开伪终端主设备,并通过参数输出对应的伪终端从设备名称

ptys_open用伪终端从设备名打开从设备

grantpt用于更改从设备的节点的权限为用户读写,组写。

unlockpt函数用于准予对伪终端从设备的访问,从而允许应用程序打开该设备。阻止其他进程打开从设备后,建立该设备的应用程序有机会在使用主,从设备之间正确地初始化

这些设备。

有一些用编译宏控制打开的函数,这些函数在 Linux 系统上一般是存在的,如果对应的系统上支持这些函数,可以通过编译宏将这些函数关闭。如果对应的系统上不存在,可以

用编译宏打开这些函数,同时可以了解这些函数的实现机制。

#include "apue.h"
#include <fcntl.h>

#ifndef _HAS_OPENPT
INT posix_openpt(INT iFlag)
{
INT iFdMaster;

iFdMaster = open("/dev/ptmx",iFlag);
return iFdMaster;
}
#endif

#ifndef _HAS_PTSNAME
CHAR *ptsname(int iFd)
{
int iSlave;
STATIC CHAR szPtsName[16];

if(ioctl(iFd,TIOCGPTN,&iSlave) < 0)
{
return NULL;
}

szPtsName[0] = 0;
snprintf(szPtsName,sizeof(szPtsName),"/dev/pts/%d",iSlave);
return szPtsName;
}
#endif

#ifndef _HAS_GRANTPT
INT grantpt(int iMaster)
{
CHAR *pcPtsName;

pcPtsName = ptsname(iMaster);
return (chmod(pcPtsName,S_IRUSR|S_IWUSR|S_IWGRP);
}
#endif

#ifndef _HAS_UNLOCKPT
INT unlockpt(int iMaster)
{
INT iLock = 0;

return (ioctl(iMaster,TIOCSPTLCK,&iLock));
}
#endif

INT ptym_open(CHAR *pcPtsName,INT iNameLen)
{
CHAR *pcName;
INT iMaster;

strncpy(pcPtsName,"/dev/ptmx",iNameLen);
pcPtsName[iNameLen - 1] = 0;

iMaster = posix_openpt(O_RDWR);
if(iMaster < 0)
{
return -1;
}

if(grantpt(iMaster) < 0)
{
close(iMaster);
return -2;
}

if(unlockpt(iMaster) < 0)
{
close(iMaster);
return -3;
}

if((pcName = ptsname(iMaster)) == NULL)
{
close(iMaster);
return -4;
}

strncpy(pcPtsName,pcName,iNameLen);
pcPtsName[iNameLen - 1] = 0;
return iMaster;
}

INT ptys_open(const CHAR *pcName)
{
int iSlave;
if((iSlave = open(pcName,O_RDWR))<0)
{
return -5;
}

return iSlave;
}

INT main()
{
CHAR szPtsName[16];
INT iMaster,iSlave;
iMaster = ptym_open(szPtsName,sizeof(szPtsName));

if(iMaster < 0)
{
printf("ptym_open err [%d]\n",iMaster);
return iMaster;
}

printf("ptym_open success %s\n",szPtsName);
iSlave = ptys_open(szPtsName);
if(iSlave < 0)
{
printf("ptys_open err [%d]\n",iSlave);
return iSlave;
}

sleep(10);

close(iMaster);
close(iSlave);
return 0;
}

十辩十析之析二-----伪终端PTY

这两天一直在叽叽复叽叽的念叨着伪终端的相关机制。一直不懂,或者是很多东西在脑子里横冲直撞。好不容易走到了最后,就这么放弃实属可惜。但是把一大本书看下来,的确也花了我很多的时间和精力,不能就因为这么点坎而让这项工程留有遗憾。其实也在网上找了相关的资料,但是我觉得解释的都不透彻,也有可能是我智拙,总之是得不到我想要的东西。后来无奈,只能从头再来,现在也算是略知一二吧。

WHY? 对,有好好的终端存在为什么要引入伪终端,其实这一概念的提出是有历史的渊源的,也算是网络技术发展所促吧。我们知道在终端登录时,是经由自动提供语义的终端设备进行的。在终端和运行的程序之间有一个终端行规程,通过它我们能够在终端上设置特殊字符,然后系统能按这些语义进行相应的操作。这是固定终端时的情形,因为init进程知道哪些设备(有与此相关的终端行规程)可用来进行登录,并为每个设备生成一个getty 进程。但是,在网络的情况下,所有登录都经由内核的网络接口驱动程序,事先并不知道将会有多少这样的登录,所以当一个登录请求到达时,终端行规程并不是自动被加载到网络连接和登录shell之间,原因就是不能事先确定终端行规程。所以引入伪终端,其来提供终端语义。就这一点而言,可以引申,相当于对输入的数据做预处理。有了这一点共识,相信对于伪终端其他方面的应用就好理解多了。

那么纵观伪终端的应用来看,对于PTY,一般都是利用了它的二方面的性质:

(1)是提供终端语义功能,这是最基本的,这一点可以引申为应用数据的预处理。

(2)终端的性质,我们知道对于终端I/O来说,一般标准库函数会提供行缓冲,以达到对数据尽量即时的输出。

先来看几个概念:

(1)       PTY与pty:

PTY是一个设备,它分为主设备和从设备。一般先打开主设备,为从设备设定权限和解锁后才能实现对从设备的引用。主设备与从设备是成对实现的,它们是由克隆设备来实现的,其底层一般是基于STREAMS的管道。

而pty是一个程序,一般父进程执行pty的主程序,其打开主设备,再fork一个作为会话首进程的子进程并使其具有控制终端,打开从设备,并将子进程的标准输入/出,和出错都指向从设备。这样,pty父进程和子进程之间就通过主从设备低层的管理连接在一起了。这样就建立了:终端输入/出<->pty父进程<->主设备<->从设备<->pty子进程。从以上的结构可以看出(1)可以将pty父进程这一块看成是对输入/出的一个预处理。(2)从设备<->pty子进程,可以将从设备看成终端,实现某些终端功能。

(2)       终端与PTY 主设备、PTY从设备:

终端:就是一般的终端,是指真正的终端。

PTY主设备:一般是一个克隆设备,在每个系统中,有其特有的名字,我们每次按这样的名字打开时,就把它看成是已经存在的一个设备,但是这个设备怎么实现的不用用户去详细了解。一般与pty父进程相关联,由父进程将终端的输入读到这个主设备中,或是将这个主设备中的数据写到终端上去。

PTY从设备:也是一个克隆设备,与主设备是成对存在的,在每个系统中,也有其特有的名字,当我们每次以这样的名字打开时,就把它看成是一个已经客观存在的设备,不用考虑这个设备的具体实现。不同与主设备,它一般模拟的是一个带有终端行规程的终端,可以提供终端语义。

(3)       主从设备之间的实现:这是由系统的克隆设备提供的,由系统来实现,这两者之间一般是由STREAMS的管道来实现这两个之间数据的交换。

PTY的应用,我不想讲述具体的应用,只想大概谈论下每种应用类型所采用的PTY思想,以及采用了这样的方式解决了它们以前存在的哪些问题。

(1)       网络登录服务器:这个不用说,是始祖了,其实就是实现登录时终端语义的提供功能。

(2)       script程序:基本上利用了数据预处理的理念,在终端的输入/出和实际的处理之间将数据通过一种方式先处理下,再让其输入和输出。

(3)       expect程序:可以用来在非交互模式中驱动交互式程序的运行。有些程序(比如交互式,或是一种脚本的交互式)需要一个终端才能运行,则让伪终端从设备扮演了终端的角色,促使pty子进程的运行。同时在pty父进程中做变化,不是让脚本中的所有内容都输入到程序中,或将程序的输出送至脚本,而是要检查程序的输出,从而决定下一步输入的内容。

(4)       运行协同进程:通过一般的pipe连接的协同进程,不能使用标准I/O库进行输入或是输出。因为当通过管道与协同进程进行通信时,标准I/O库会将标准输入和输出的内容放到缓冲区中,从而引起死锁,而如果协同进程是一个已经编译的程序而我们又没有源程序时,则无法在源程序中加入fflush语句来解决这个问题。而将一个伪终端放到两个进程之间,这诱使协同进程认为它是由终端而非另一个进程驱动的,这样协同进程的标准输入和输出就像终端设备一样,所以标准I/O库将这两个流设置为行缓冲,可以尽量即时的输出和输入了。这就是利用了终端行具有行缓冲的理念,促使协同进程尽早的实现数据的I/O。

(5)       观看长时间运行程序的输出:这个就不用说了,道理同于上一个,就是利用了终端行缓冲性质,让标准I/O库认为标准输出是终端,这样能尽早的实现输出。

第一章 概论 ..................................................................................................................1 1.1 网络的历史.......................................................................................................1 1.2 OSI 模型...........................................................................................................3 1.3 Internet 体系模型..............................................................................................4 1.4 客户/服务器模型...............................................................................................5 1.4 UNIX 的历史 ...................................................................................................7 1.4.1 Unix 诞生前的故事 .................................................................................7 1.4.2 UNIX 的诞生..........................................................................................8 1.4.3 1979 – UNIX 第七版 ............................................................................. 10 1.4.4 UNIX 仅仅是历史吗?............................................................................. 11 1.5 Linux 的发展.................................................................................................. 11 1.5.1 Linux 的发展历史 .................................................................................. 12 1.5.2 什么叫 GNU? ...................................................................................... 12 1.5.3 Linux 的特色 ........................................................................................ 13 1.5.4 硬件需求............................................................................................... 14 1.5.5 Linux 可用的软件 ................................................................................. 14 1.5.6 为什么选择 Linux ? ............................................................................ 15 1.6 Linux 和 Unix 的发展 .................................................................................... 15 第二章 UNIX/ Linux 模型...............................................................................................17 2.1 UNIX/ Linux 基本结构.......................................................................................17 2.2 输入和输出......................................................................................................19 2.2.1 UNIX/ Linux 文件系统简介 ......................................................................19 2.2.2 流和标准 I/O 库......................................................................................20 2.3 进程 ................................................................................................................21 第三章 进程控制 ..........................................................................................................22 3.1 进程的建立与运行 ...........................................................................................22 3.1.1 进程的概念 ............................................................................................22 3.1.2 进程的建立 ............................................................................................22 3.1.3 进程的运行 ............................................................................................24 3.1.4 数据和文件描述符的继承 .......................................................................29 3.2 进程的控制操作...............................................................................................31 3.2.1 进程的终止 ............................................................................................31 3.2.2 进程的同步 ............................................................................................32 3.2.3 进程终止的特殊情况 ..............................................................................33 3.2.4 进程控制的实例 .....................................................................................33 3.3 进程的属性......................................................................................................38 3.3.1 进程标识符 ............................................................................................38 3.3.2 进程的组标识符 .....................................................................................39 3.3.3 进程环境................................................................................................40 3.3.4 进程的当前目录 .....................................................................................42 3.3.5 进程的有效标识符..................................................................................43 3.3.6 进程的资源 ............................................................................................44 3.3.7 进程的优先级.........................................................................................45 3.4 守护进程 .........................................................................................................46 3.4.1 简介.......................................................................................................46 3.4.2 守护进程的启动 ............................................................................................46 3.4.3 守护进程的错误输出 ..............................................................................46 3.4.4 守护进程的建立 .....................................................................................48 3.5 本章小结 .........................................................................................................49 第四章 进程间通信.......................................................................................................50 4.1 进程间通信的一些基本概念 .............................................................................50 4.2 信号 ................................................................................................................50 4.2.1 信号的处理 ............................................................................................52 4.2.2 信号与系统调用的关系...........................................................................54 4.2.3 信号的复位 ............................................................................................55 4.2.4 在进程间发送信号..................................................................................56 4.2.5 系统调用 alarm()和 pause()......................................................................58 4.2.6 系统调用 setjmp()和 longjmp().................................................................62 4.3 管道 ................................................................................................................63 4.3.1 用 C 来建立、使用管道 ..........................................................................65 4.3.2 需要注意的问题 .....................................................................................72 4.4 有名管道 .........................................................................................................72 4.4.1 有名管道的创建 .....................................................................................72 4.4.2 有名管道的 I/O 使用...............................................................................73 4.4.3 未提到的关于有名管道的一些注意 .........................................................75 4.5 文件和记录锁定...............................................................................................75 4.5.1 实例程序及其说明..................................................................................75 4.5.2 锁定 的几个概念..................................................................................78 4.5.3 System V 的咨询锁定..............................................................................78 4.5.4 BSD 的咨询式锁定 .................................................................................79 4.5.5 前面两种锁定方式的比较 .......................................................................81 4.5.6 Linux 的其它上锁技术 ............................................................................81 4.6 System V IPC ...................................................................................................84 4.6.1 ipcs 命令 ................................................................................................85 4.6.2 ipcrm 命令..............................................................................................86 4.7 消息队列( Message Queues) ...........................................................................86 4.7.1 有关的数据结构 .....................................................................................86 4.7.2 有关的函数 ............................................................................................89 4.7.3 消息队列实例—— msgtool,一个交互式的消息队列使用工具 ..................94 4.8 信号量(Semaphores) .........................................................................................97 4.8.1 有关的数据结构 .....................................................................................98 4.8.2 有关的函数 ............................................................................................99 4.8.3 信号量的实例—— semtool,交互式的信号量使用工具...........................103 4.9 共享内存(Shared Memory) ..............................................................................109 4.9.1 有关的数据结构 ...................................................................................109 4.9.2 有关的函数 .......................................................................................... 110 4.9.3 共享内存应用举例—— shmtool,交互式的共享内存使用工具................... 112 4.9.4 共享内存与信号量的结合使用 .............................................................. 114 第五章 通信协议简介 .................................................................................................120 5.1 引言 ..............................................................................................................120 5.2 XNS( Xerox Network Systems)概述..............................................................120 5.2.1 XNS 分层结构......................................................................................120 5.3 IPX/SPX 协议概述........................................................................................122 5.3.1 网际包交换( IPX) .............................................................................122 5.3.2 排序包交换( SPX) .............................................................................124 5.4 Net BIOS 概述................................................................................................124 5.5 Apple Talk 概述 ..............................................................................................125 5.6 TCP/IP 概述...................................................................................................126 5.6.1 TCP/IP 结构模型 ..................................................................................126 5.6.2 Internet 协议( IP) ...............................................................................127 5.6.3 传输控制协议( TCP) .........................................................................132 5.6.4 用户数据报文协议................................................................................134 5.7 小结 ..............................................................................................................135 第六章 Berkeley 套接字 ............................................................................................. 136 6.1 引言 ............................................................................................................. 136 6.2 概述 ............................................................................................................. 136 6.2.1 Socket 的历史...................................................................................... 136 6.2.2 Socket 的功能...................................................................................... 136 6.2.3 套接字的三种类型............................................................................... 138 6.3 Linux 支配的网络协议................................................................................... 141 6.3.1 什么是 TCP/IP? ................................................................................... 141 6.4 套接字地址................................................................................................... 142 6.4.1 什么是 Socket? .................................................................................. 142 6.4.2 Socket 描述符...................................................................................... 142 6.4.3 一个套接字是怎样在网络上传输数据的? ............................................ 143 6.5 套接字的一些基本知识 ................................................................................. 144 6.5.1 基本结构............................................................................................. 144 6.5.2 基本转换函数...................................................................................... 145 6.6 基本套接字调用............................................................................................ 147 6.6.1 socket() 函数....................................................................................... 147 6.6.2 bind() 函数 ......................................................................................... 148 6.6.3 connect()函数 ...................................................................................... 150 6.6.4 listen() 函数........................................................................................ 151 6.6.5 accept()函数 ........................................................................................ 152 6.6.6 send()、 recv()函数 ............................................................................... 154 6.6.7 sendto() 和 recvfrom() 函数 ................................................................. 155 6.6.8 close()和 shutdown()函数...................................................................... 156 6.6.9 setsockopt() 和 getsockopt() 函数 ......................................................... 157 6.6.10 getpeername()函数.............................................................................. 157 6.6.11 gethostname()函数.............................................................................. 158 6.7 DNS 的操作.................................................................................................. 158 6.7.1 理解 DNS............................................................................................ 158 6.7.2 和 DNS 有关的函数和结构 .................................................................. 158 6.7.3 DNS 例程............................................................................................ 159 6.8 套接字的 Client/Server 结构实现的例子.......................................................... 160 6.8.1 简单的流服务器 .................................................................................. 161 6.8.2 简单的流式套接字客户端程序 ............................................................. 163 6.8.3 数据报套接字例程( DatagramSockets) ............................................... 165 6.9 保留端口 ...................................................................................................... 169 6.9.1 简介.................................................................................................... 169 6.9.2 保留端口............................................................................................. 170 6.10 五种 I/O 模式................................................................................................. 179 6.10.1 阻塞 I/O 模式 .................................................................................... 179 6.10.2 非阻塞模式 I/O.................................................................................. 180 6.10.3 I/O 多路复用 ..................................................................................... 181 6.10.4 信号驱动 I/O 模式 ............................................................................. 182 6.10.5 异步 I/O 模式 .................................................................................... 185 6.10.6 几种 I/O 模式的比较.......................................................................... 186 6.10.7 fcntl()函数 ......................................................................................... 186 6.10.8 套接字选择项 select()函数.................................................................. 187 6.11 带外数据..................................................................................................... 190 6.11.1 TCP 的带外数据 ................................................................................ 190 6.11.2 OOB 传输套接字例程(服务器代码 Server.c) ................................... 193 6.11.3 OOB 传输套接字例程(客户端代码 Client.c) .................................... 196 6.11.4 编译例子 ........................................................................................... 199 6.12 使用 Inetd( Internet 超级服务器) ............................................................... 199 6.12.1 简介.................................................................................................. 199 6.12.2 一个简单的 inetd 使用的服务器程序 hello inet service.......................... 199 6.12.3 /etc/services 和 /etc/inetd.conf 文件 ..................................................... 200 6.12.4 一个复杂一些的 inetd 服务器程序 ...................................................... 201 6.12.5 一个更加复杂的 inetd 服务器程序 ...................................................... 203 6.12.6 程序必须遵守的安全性准则............................................................... 205 6.12.7 小结.................................................................................................. 205 6.13 本章总结 .................................................................................................... 205 第七章 网络安全性.....................................................................................................206 7.1 网络安全简介 ................................................................................................206 7.1.1 网络安全的重要性................................................................................206 7.1.2 信息系统安全的脆弱性.........................................................................207 7.2 Linux 网络不安全的因素 ................................................................................209 7.3 Linux 程序员安全........................................................................................... 211 7.3.1 系统子程序 ..........................................................................................212 7.3.2 标准 C 函数库.......................................................................................214 7.3.3 书写安全的 C 程序................................................................................216 7.3.4 SUID/SGID 程序指导准则......................................................................217 7.3.5 root 程序的设计....................................................................................218 7.4 小结 ..............................................................................................................219 第八章 Ping 例程 .......................................................................................................220 8.1 Ping 命令简介 ................................................................................................220 8.2 Ping 的基本原理.............................................................................................220 8.3 小结 ..............................................................................................................221 第九章 tftp 例程.........................................................................................................222 9.1 tftp 协议简介..................................................................................................222 9.2 tftp 的使用 .....................................................................................................222 9.3 tftp 的原理 .....................................................................................................223 9.3 tftp 的基本结构 ..............................................................................................223 9.4 小节 ..............................................................................................................225 第十章 远程命令执行 .................................................................................................226 10.1 引言 ............................................................................................................226 10.2 rcmd 函数和 rshd 服务器...............................................................................227 10.3 rexec 函数和 rexecd 服务器...........................................................................233 第十一章 远程注册.....................................................................................................235 11.1 简介.............................................................................................................235 11.2 终端 行律和 终端 ........................................................................................235 11.3 终端 方式字和控制 终端 .................................................................................239 11.4 rlogin 概述....................................................................................................242 11.5 窗口环境......................................................................................................242 11.6 流控制与 终端 方式字.................................................................................243 11.7 rlogin 客户程序.............................................................................................245 11.8 rlogin 服务器 ................................................................................................246 第十二章 远程过程调用..............................................................................................249 12.1 引言 ............................................................................................................249 12.2 远程过程调用模型 .......................................................................................249 12.3 传统过程调用和远程过程调用的比较 ...........................................................250 12.4 远程过程调用的定义....................................................................................252 12.5 远程过程调用的有关问题.............................................................................252 12.5.1 远程过程调用传送协议.......................................................................253 12.5.2 Sun RPC ...........................................................................................254 12.5.3 Xerox Courier ....................................................................................254 12.5.4 Apollo RPC........................................................................................255 12.6 stub 过程简介...............................................................................................256 12.7 rpcgen 简介 ..................................................................................................256 12.8 分布式程序生成的例子 ................................................................................257 12.8.1 我们如何能够构造出一个分布式应用程序...........................................257 12.9 小结 ............................................................................................................283 第十三章 远程磁带的访问 ..........................................................................................284 13.1 简介 ............................................................................................................284 13.2 Linux 磁带驱动器的处理 ..............................................................................285 13.3 rmt 协议.......................................................................................................285 13.4 rmt 服务器设计分析 .....................................................................................286 第十四章 WWW 上 HTTP 协议.................................................................................. 290 14.1 引言............................................................................................................ 290 14.2 HTTP 客户请求........................................................................................... 290 14.2.1 客户端 .............................................................................................. 290 14.2.2 服务器端........................................................................................... 290 14.2.3 Web 请求简介.................................................................................... 291 14.2.4 HTTP – HyperText Transfer Protocol 超文本传输协议 ........................... 295 14.3 Web 编程 .................................................................................................... 297 14.4 小结 ........................................................................................................... 301 附录 A 有关网络通信的服务和网络库函数...................................................................302 附录 B Vi 使用简介.....................................................................................................319 B.1 Vi 基本观念...................................................................................................319 B.1.1 进入与离开..........................................................................................319 B.1.2 Vi 输入模式 .........................................................................................319 B.2 Vi 基本编辑...................................................................................................320 B.2.1 删除与修改..........................................................................................320 B.3 Vi 进阶应用...................................................................................................320 B.3.1 移动光标 .............................................................................................320 B.3.2 进阶编辑命令 ......................................................................................322 B.3.3 文件命令 .............................................................................................322 附录 C Linux 下 C 语言使用与调试简介 ......................................................................324 C.1 C 语言 编程 ...................................................................................................324 C.2 什么是 C? .....................................................................................................324 C.3 GNU C 编译器...............................................................................................324 C.3.1 使用 GCC............................................................................................324 C.3.2 GCC 选项 ............................................................................................325 C.3.3 优化选项 .............................................................................................325 C.3.4 调试和剖析选项...................................................................................325 C.3.5 用 gdb 调试 GCC 程序..........................................................................326 C.4 另外的 C 编程 工具 ........................................................................................330 C.4.1 Xxgdb..................................................................................................330 C.4.2 Calls ....................................................................................................331 C.4.3 cproto ..................................................................................................332 C.4.4 Indent ..................................................................................................333 C.4.5 Gprof...................................................................................................334 C.4.6 f2c 和 p2c ............................................................................................335 附录 D Ping 源码 ........................................................................................................336 附录 E TFTP 服务器程序源码 .....................................................................................362 1.3 Internet 体系模型.............4 1.4 客户/服务器模型..............5 1.4 UNIX 的历史 ..................7 1.4.1 Unix 诞生前的故事...7 1.4.2 UNIX 的诞生.........8 1.4.3 1979 – UNIX 第七版........... 10 1.4.4 UNIX 仅仅是历史吗?........... 11 1.5 Linux 的发展................. 11 1.5.1 Linux 的发展历史.... 12 1.5.2 什么叫GNU? ..... 12 1.5.3 Linux 的特色....... 13 1.5.4 硬件需求.............. 14 1.5.5 Linux 可用的软件... 14 1.5.6 为什么选择 Linux ? .......... 15 1.6 Linux 和 Unix 的发展... 15 第二章 UNIX/ Linux 模型..............17 2.1 UNIX/ Linux 基本结构......17 2.2 输入和输出.....................19 2.2.1 UNIX/ Linux 文件系统简介....19 2.2.2 流和标准I/O 库.....20 2.3 进程............21 第三章进程控制 ......22 3.1 进程的建立与运行..........22 3.1.1 进程的概念...........22 3.1.2 进程的建立...........22 3.1.3 进程的运行...........24 3.1.4 数据和文件描述符的继承.....29 3.2 进程的控制操作..............31 3.2.1 进程的终止...........31 3.2.2 进程的同步...........32 3.2.3 进程终止的特殊情况............33 3.2.4 进程控制的实例....33 3.3 进程的属性.....................38 3.3.1 进程标识符...........38 3.3.2 进程的组标识符....39 3.3.3 进程环境...............40 3.3.4 进程的当前目录....42 3.3.5 进程的有效标识符....43 3.3.6 进程的资源...........44 3.3.7 进程的优先级........45 3.4 守护进程.....46 3.4.1 简介...46 3.4.2 守护进程的启动...........46 3.4.3 守护进程的错误输出............46 3.4.4 守护进程的建立....48 3.5 本章小结.....49 第四章进程间通信...50 4.1 进程间通信的一些基本概念...........50 4.2 信号............50 4.2.1 信号的处理...........52 4.2.2 信号与系统调用的关系.........54 4.2.3 信号的复位...........55 4.2.4 在进程间发送信号....56 4.2.5 系统调用alarm()和pause()....58 4.2.6 系统调用setjmp()和longjmp()...........62 4.3 管道............63 4.3.1 用C 来建立、使用管道........65 4.3.2 需要注意的问题....72 4.4 有名管道.....72 4.4.1 有名管道的创建....72 4.4.2 有名管道的I/O 使用.............73 4.4.3 未提到的关于有名管道的一些注意...75 4.5 文件和记录锁定..............75 4.5.1 实例程序及其说明....75 4.5.2 锁定 的几个概念....78 4.5.3 System V 的咨询锁定............78 4.5.4 BSD 的咨询式锁定...79 4.5.5 前面两种锁定方式的比较.....81 4.5.6 Linux 的其它上锁技术..........81 4.6 System V IPC ..................84 4.6.1 ipcs 命令...............85 4.6.2 ipcrm 命令.............86 4.7 消息队列(Message Queues).........86 4.7.1 有关的数据结构....86 4.7.2 有关的函数..... 在刚开始学习 Linux 时,对物理 终端 、虚拟 终端 以及 终端 的概念非常困惑,此文是我马哥培训学习后对这些概念的理解。物理 终端 :直接连接在主机上的显示器、键盘鼠标统称。在实际机架式服务器部署 ,一般是多台服务器共享一套 终端 ,简称KVM(Keyboard键盘,video显示器,mouse鼠标)虚拟 终端 (tty):附加在物理 终端 之上,用软件方式虚拟实现,CentOS默认启用6个虚拟 终端 ,可以通过快捷键来切换... 这两天一直在叽叽复叽叽的念叨着 终端 的相关机制。一直不懂,或者是很多东西在脑子里横冲直撞。好不容易走到了最后,就这么放弃实属可惜。但是把一大本书看下来,的确也花了我很多的时间和精力,不能就因为这么点坎而让这项工程留有遗憾。其实也在网上找了相关的资料,但是我觉得解释的都不透彻,也有可能是我智拙,总之是得不到我想要的东西。后来无奈,只能从头再来,现在也算是略知一二吧。 WHY? 对,有好好的 终端 在服务器上,TTY设备可以通过SSH等远程登录方式进行访问,管理员可以通过TTY设备管理服务器。 终端 设备是一种通过串行接口与计算机连接的设备,可以显示计算机的输出结果,并将用户的输入传递给计算机。 终端 是一种特殊的设备,它提供了一个类似于物理 终端 的接口,可以用于在用户空间和内核空间之间进行交互。与 终端 交互:TTY设备是用户与计算机进行交互的接口,了解TTY概念可以帮助开发者编写与 终端 交互的程序。需要注意的是,虽然 终端 设备的名称可能不同,但它们在功能上是相似的,都可以用于与用户进行交互和执行命令。 终端 是一个虚拟设备,它提供了一个 IPC 通道。通道的一端是一个期望连接到 终端 设备的程序。通道的另一端也是一个程序,这个程序通过 IPC 通道来发送其输入并读取输出以此来驱动面向 终端 的程序。 通过网络通信,套接字提供了解决这个问题的驱动部分。但是,我们无法直接面向 终端 程序的标准输入,输出和错误信息连接到套接字上。这是因为 面向 终端 程序期望连接的是一个 终端 ---以此... 终端 是SSH服务的基础,它使得远程访问和操作成为可能。通过理解 终端 的基本概念,以及如何查看和配置其数量,我们可以更好地管理和维护系统,保证其稳定性和安全性。 终端 的配置也反映了 Linux 系统的灵活性和可配置性,展现了其在企业应用 的强大潜力。 #include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include"pty_fun.h"#defineD... 物理 终端 :直接连接在主机上的显示器、键盘鼠标统称。在实际机架式服务器部署 ,一般是多台服务器共享一套 终端 ,简称KVM(Keyboard键盘,video显示器,mouse鼠标) 虚拟 终端 (tty):附加在物理 终端 之上,用软件方式虚拟实现,CentOS默认启用6个虚拟 终端 ,可以通... 通过《 Linux 终端 (TTY)》一文我们了解到:我们常说的 终端 分为 终端 tty1-6 和 终端 。使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vSphere console 等虚拟化方案,其它情况下使用的都是 终端 。本文将介绍 终端 的基本概念。本文 演示部分使用的环境为 ubuntu 18.04。 终端 (pseudo termina... 主要函数NAMEopenpty, login_tty, forkpty - tty utility functionsSYNOPSIS#include int openpty(int *amaster, int *aslave, char *name,struct termios *termp, struct winsize *winp);pid_t forkpty(int *amaster, c... Linux 终端 是对应于/dev/pts/x,这个/dev/pts其实也只是devpts的挂载目录,通过如下命令挂在的。mount devpts /dev/pts -t devpts 终端 (Pseudo Terminal)是成对的逻辑终设备(即master和slave设备,对master的操作会反映到slave上)。 例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统 分别... //创建 终端 (master、slave)对 int masterfd = open("/dev/ptmx", O_RDWR); 关联 标准输入(fd=0) 标准输出(fd=1) //标准输入(fd=0) const static int _STD_IN_FD = 0; //标准输出(fd=1) const static int _... 从串行设备(/ dev / ttyXX)读取多个进程可以使两个进程无法获取所有数据-数据将以某种方式在它们之间分配。我想编写一个程序,该程序从串行设备读取,创建几个主/从pty对,然后允许从串行设备读取的程序改为从pty读取,以便所有读取过程都接收数据从串行设备 读取数据,让pty像串行设备一样,从它们开始从pty读取数据时,它们只会获得最新数据。换句话说,在开始读取之前,您将不会获得任何写入的数... 本文将为您描述[apue] 书 关于 终端 的一个纰漏,具体实现方法:在看 apue 第 19 章 终端 第 6 节使用 pty 程序时,发现“检查长时间运行程序的输出”这一部分内容的实际运行结果,与书上所说有出入。于是展开一番研究,最终发现是书上讲的有问题,现在摘出来让大家评评理。先上代码pty.cpty_fun.c这是书上标准的 pty 程序,简单说起来就是提供一个 终端 给被调用程序使用,例如pt...