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