console tty pts 等问题

本文详细介绍了Linux系统中的console、terminal、tty、pty、pts、ptmx等概念及其区别。console是控制系统的地方,而terminal是用户使用的入口。tty是终端设备的统称,包括串行端口终端、控制台终端、虚拟终端和伪终端。pty是用于网络登录等场景的虚拟终端,通过ptmx创建并对应/dev/pts/下的slave设备。了解这些概念有助于深入理解Linux系统的交互机制。
摘要由CSDN通过智能技术生成

本文参考了如下两篇文章: http://wangcong.org/blog/?p=423 http://blog.chinaunix.net/u/6436/showart_1003495.html 这两个术语从中文意思上很容易混在一起,但他们确实是两个不同的概念。 传统上讲,terminal(终端),其实是处于用户使用系统的角度来说的,相对于提供服务的系统终端是用户使用这个系统的入口。而console(控制台)更强调是控制系统的地方,其使用者主要是管理员。从概念上讲terminal的范围比console要广。 tty(终端设备的统称) tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。 终端分为很多种 1)串行端口终端,对应windows上的COM1,COM2...的概念。在Linux中,他们对应的设备为/dev/ttySn(像我的机器上四个串口,就对应/dev/ttyS0~/dev/ttyS3). 2)控制台终端 真实的硬件设备,对应的设备是/dev/console,除了实际的Console,Linux还定义了Virtual Console,分别对应与/dev/tty1~tty63.其中ctrl+alt+Fn(n:1~6)可以分别切换到tty1~tty6六个Virtual Console. /dev/tty0比较特殊,他对应当前的console. 3)伪终端(pseudo-tty) 伪终端是一对虚拟设备,提供端到端双向通信的通路,一端称为master,另一端称为slave。在slave那端看到的和在真实终端看到的效果一样。所以伪终端一般被ssh等网络登录程序使用。历史上,有两套伪终端接口,一个是Unix 98伪终端,另一个是BSD伪终端。 BSD伪终端对应的设备为:/dev/pty[p-za-e][0-9a-f] 是master; /dev/tty[p-za-e][0-9a-f] 是slave,它们都是配好对的。 Unix 98伪终端则完全不同,它始终使用/dev/ptmx作为master复制设备,然后在每次打开它的时候才得到一个master设备的fd,同时在 /dev/pts/目录下得到一个slave设备。 不同发行版采用的伪终端接口不同,不过BSD伪终端方式逐渐被舍弃,而倾向于Unix98伪终端接口。 我使用的的Ubuntu9.04就是Unix98伪终端。在X window模式下,每开一个Gnome-Termial,就会在/dev/pts/目录下多一个文件(通过telnet登录也是如此),可以echo "hello,xxx" >/dev/pts/1,则在对应第一个伪终端的命令行行上出现“hello,xxx"输入。 4)其他。

 

 

 

consoleterminal是很容易让人迷惑的两个概念。根据wikipedia上的定义,小型计算机的console应该就是键盘加显示器;而terminal则是输入数据进去,和显示数据来源的设备,通常是一个计算机系统。

Linux下的console除了真实的硬件设备外,还有virtual console,也就是你按alt+Fn或者alt+ctrl+Fn切换到的东西。所谓虚拟就是这些console共享同一个真实的设备,只有一个活动的console才显示在前面。这些console对应的设备是:/dev/ttyN,其中1 ≤ N ≤ 63。而/dev/tty0则是指向当前的terminal;/dev/console是指向当前console,但它现在并_不是_对/dev/tty0的符号链接。更多可参考console(4)。

/dev/tty是另一个特殊设备,它指向控制终端(controlling terminal)。如果某个进程的控制终端是/dev/tty3,那么/dev/tty就指向/dev/tty3了。控制终端是什么概念?它是一个进程的某个属性,是依附带该进程上的终端。比如我们在某个终端下输入ctrl+C,那么它控制的前台进程就会收到SIGINT,而后台进程会收到SIGTTIN或SIGTTOU ,如果它们读写该终端的话。被同一个终端控制的所有进程被称为一个会话(session),会话的领导就是创建改会话的进程,其子进程也会被该终端控制。所以,1) 需要交互的命令行程序通常会从/dev/tty这个设备进行读写;2) Unix后台进程都需要在fork之后调用setsid(2),3) 需要加O_NOCTTY,当你open一个可能是终端的文件时。

另外,想要确定/dev/tty究竟是指向哪个设备,可以调用TIOCCONS ioctl。参考tty(4)。

下面是另外一个概念——伪终端(pseudo-terminal),根据pty(7)的介绍,伪终端一对虚拟设备,提供端到端双向通信的通路,一端称为master,另一端称为slave。在slave那端看到的和在真实终端看到的效果一样。所以伪终端一般被ssh等网络登录程序使用。历史上,有两套伪终端接口,一个是Unix 98伪终端,另一个是BSD伪终端。

BSD提供的接口很简单:/dev/pty[p-za-e][0-9a-f] 是master; /dev/tty[p-za-e][0-9a-f] 是slave,它们都是配好对的。这样看起来很简单,但对程序员来说不容易,要找到一个合适的终端需要一个个从头尝试。所以这种方式已经被遗弃。而Unix 98伪终端则完全不同,它始终使用/dev/ptmx作为master复制设备,然后在每次打开它的时候才得到一个master设备的fd,同时在/dev/pts/目录下得到一个slave设备。这样编程就相对容易了,根据pts(4)介绍,需要三个新的API: ptsname(3),grantpt(3)和unlockpt(3)。我们可以通过一个实例看一下如何使用:

(以下代码摘自netvirt)

C:
  1. char    *mptname = "/dev/ptmx"; /* master pseudo-tty device */
  2. //...
  3. void
  4. getmaster ( )
  5. {
  6.     struct stat stb;
  7.  
  8.     if ( (master = open (mptname, O_RDWR ) )> = 0 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值