⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000019.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件中接下来的函数是ptys_open,该函数真正被用来打开一个从设备。在SVR4系&nbsp;&nbsp;<BR>统中,如果调用者是一个还没有控制终端的会话,open就会分配一个从设备作为控&nbsp;&nbsp;<BR>制终端。如果我们不希望函数自动做这件事,可以在调用时指明O_NOCTTY标志。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在打开从设备后,我们将三个流模块放在从设备的流上。Ptem是&quot;伪终端&quot;虚拟模&nbsp;&nbsp;<BR>块,ldterm是终端行规程模块。这两个模块合在一起象一个真正的终端模块一样工&nbsp;&nbsp;<BR>作。ttcompat提供了向老系统如V7、4BSD和Xenix的ioctl调用的兼容性。这是一个&nbsp;&nbsp;<BR>可选的模块,但是因为它自动尝试控制台登录和网络登录(见程序12.10的输出)&nbsp;&nbsp;<BR>,我们将其加到从设备的流中。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用这两个函数的结果是得到:伪终端主设备的文件描述符和从设备的文件描述&nbsp;&nbsp;<BR>符。&nbsp;&nbsp;<BR>19.3.2&nbsp;&nbsp;4.3+BSD&nbsp;&nbsp;<BR>在4.3+BSD系统中我们必须自己来确定第一个可用的伪终端主设备。为达到这个目&nbsp;&nbsp;<BR>的,我们从/dev/ptyp0开始并不断尝试直到成功打开一个可用的伪终端主设备或试&nbsp;&nbsp;<BR>完所有设备。在打开设备的时候,我们会看到两种可能的错误:EIO指设备已经被&nbsp;&nbsp;<BR>使用;ENOENT表示设备不存在。在后一种情况,我们可以停止搜索,因为所有的伪&nbsp;&nbsp;<BR>终端设备都在被使用中。一旦我们成功打开一个例如名为/dev/ptyMN的伪终端主设&nbsp;&nbsp;<BR>备,那么对应的从设备的名称为/dev/ttyMN。&nbsp;&nbsp;<BR>程序19.2中的函数ptys_open打开该从设备。我们在该函数中调用chown和chmod,&nbsp;&nbsp;<BR>必须意识到调用这两个函数的进程必须有超级用户的权限。如果必须改变权限标志&nbsp;&nbsp;<BR>,那么这两个函数必须放在一个set_user_ID的root用户的可执行程序中,这类似&nbsp;&nbsp;<BR>于4.3+BSD系统下的grantpt函数。&nbsp;&nbsp;<BR>在4.3+BSD系统之下打开pty从设备不具有象分配作为控制终端的设备那样的副作用&nbsp;&nbsp;<BR>。我们将在下一节探讨如何在4.3+BSD系统下分配控制终端。&nbsp;&nbsp;<BR>这个函数尝试16个不同的伪终端主设备:从/dev/ptyp0到/dev/ptyTf。具体有效的&nbsp;&nbsp;<BR>pty设备号取决于两个因素:(a)在内核中配置的号码;(b)在/dev目录下的特&nbsp;&nbsp;<BR>殊文件号。对于任何程序来说,有效的号码是(a)和(b)中较小的一个。并且,&nbsp;&nbsp;<BR>即使(a)和(b)中小的值大于64,许多现有的BSD应用(telnetd,rlogind,等&nbsp;&nbsp;<BR>等)会搜索程序19.2中第一个for循环中的&quot;pqrs&quot;。&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>________&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/types.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/stat.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;errno.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fcntl.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;grp.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;ourhdr.h&quot;&nbsp;&nbsp;<BR>使用;ENOENT表示设备不存在。在后一种情况,我们可以停止搜索,因为所有的伪&nbsp;&nbsp;<BR>终端设备都在被使用中。一旦我们成功打开一个例如名为/dev/ptyMN的伪终端主设&nbsp;&nbsp;<BR>备,那么对应的从设备的名称为/dev/ttyMN。&nbsp;&nbsp;<BR>程序19.2中的函数ptys_open打开该从设备。我们在该函数中调用chown和chmod,&nbsp;&nbsp;<BR>必须意识到调用这两个函数的进程必须有超级用户的权限。如果必须改变权限标志&nbsp;&nbsp;<BR>,那么这两个函数必须放在一个set_user_ID的root用户的可执行程序中,这类似&nbsp;&nbsp;<BR>于4.3+BSD系统下的grantpt函数。&nbsp;&nbsp;<BR>在4.3+BSD系统之下打开pty从设备不具有象分配作为控制终端的设备那样的副作用&nbsp;&nbsp;<BR>。我们将在下一节探讨如何在4.3+BSD系统下分配控制终端。&nbsp;&nbsp;<BR>这个函数尝试16个不同的伪终端主设备:从/dev/ptyp0到/dev/ptyTf。具体有效的&nbsp;&nbsp;<BR>pty设备号取决于两个因素:(a)在内核中配置的号码;(b)在/dev目录下的特&nbsp;&nbsp;<BR>殊文件号。对于任何程序来说,有效的号码是(a)和(b)中较小的一个。并且,&nbsp;&nbsp;<BR>即使(a)和(b)中小的值大于64,许多现有的BSD应用(telnetd,rlogind,等&nbsp;&nbsp;<BR>等)会搜索程序19.2中第一个for循环中的&quot;pqrs&quot;。&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>________&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/types.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sys/stat.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;errno.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fcntl.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;grp.h&gt;&nbsp;&nbsp;<BR>#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;ourhdr.h&quot;&nbsp;&nbsp;<BR>int&nbsp;&nbsp;<BR>ptym_open(char&nbsp;*pts_name)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fdm;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;*ptr1,&nbsp;*ptr2;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pts_name,&nbsp;&quot;/dev/ptyXY&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;array&nbsp;index:&nbsp;0123456789&nbsp;(for&nbsp;references&nbsp;in&nbsp;following&nbsp;code)&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(ptr1&nbsp;=&nbsp;&quot;pqrstuvwxyzPQRST&quot;;&nbsp;*ptr1&nbsp;!=&nbsp;0;&nbsp;ptr1++)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts_name[8]&nbsp;=&nbsp;*ptr1;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(ptr2&nbsp;=&nbsp;&quot;0123456789abcdef&quot;;&nbsp;*ptr2&nbsp;!=&nbsp;0;&nbsp;ptr2++)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts_name[9]&nbsp;=&nbsp;*ptr2;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;try&nbsp;to&nbsp;open&nbsp;master&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(fdm&nbsp;=&nbsp;open(pts_name,&nbsp;O_RDWR))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(errno&nbsp;==&nbsp;ENOENT)&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;different&nbsp;from&nbsp;EIO&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;out&nbsp;o&nbsp;&nbsp;<BR>&nbsp;pty&nbsp;devices&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;try&nbsp;n&nbsp;&nbsp;<BR>xt&nbsp;pty&nbsp;device&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts_name[5]&nbsp;=&nbsp;'t';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;change&nbsp;&quot;pty&quot;&nbsp;to&nbsp;&quot;tty&quot;&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(fdm);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;got&nbsp;it,&nbsp;return&nbsp;fd&nbsp;of&nbsp;master&nbsp;*&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;out&nbsp;of&nbsp;pty&nbsp;devices&nbsp;*/&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>int&nbsp;&nbsp;<BR>ptys_open(int&nbsp;fdm,&nbsp;char&nbsp;*pts_name)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;group&nbsp;&nbsp;&nbsp;&nbsp;*grptr;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gid,&nbsp;fds;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(grptr&nbsp;=&nbsp;getgrnam(&quot;tty&quot;))&nbsp;!=&nbsp;NULL)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gid&nbsp;=&nbsp;grptr-&gt;gr_gid;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gid&nbsp;=&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;group&nbsp;tty&nbsp;is&nbsp;not&nbsp;in&nbsp;the&nbsp;group&nbsp;file&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;following&nbsp;two&nbsp;functions&nbsp;don't&nbsp;work&nbsp;unless&nbsp;we're&nbsp;root&nbsp;&nbsp;<BR>/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chown(pts_name,&nbsp;getuid(),&nbsp;gid);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chmod(pts_name,&nbsp;S_IRUSR&nbsp;|&nbsp;S_IWUSR&nbsp;|&nbsp;S_IWGRP);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(fds&nbsp;=&nbsp;open(pts_name,&nbsp;O_RDWR))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fdm);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-1);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(fds);&nbsp;&nbsp;<BR>}&nbsp;&nbsp;<BR>_______________________________________________________________________&nbsp;&nbsp;<BR>________&nbsp;&nbsp;<BR>程序19.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.3+BSD系统下的伪终端open函数&nbsp;&nbsp;<BR>19.4&nbsp;&nbsp;&nbsp;pty_fork函数&nbsp;&nbsp;<BR>现在我们使用上一节中的两个函数:ptym_open和ptys_open,编写我们称之为pty&nbsp;&nbsp;<BR>_fork的函数。这个新函数具有了如下功能:打开主设备和从设备,建立作为会话&nbsp;&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -