我正在阅读wayland / weston代码,设置tty部分。我发现它试图获取一个可用的tty来做KMS并启动windows。
这是它的作用:
if (!wl->new_user) {
wl->tty = STDIN_FILENO;
} else if (tty) {
t = ttyname(STDIN_FILENO);
if (t && strcmp(t, tty) == 0)
wl->tty = STDIN_FILENO;
else
wl->tty = open(tty, O_RDWR | O_NOCTTY);
} else {
int tty0 = open("/dev/tty0", O_WRONLY | O_CLOEXEC);
char filename[16];
if (tty0 < 0)
error(1, errno, "could not open tty0");
if (ioctl(tty0, VT_OPENQRY, &wl->ttynr) < 0 || wl->ttynr == -1)
error(1, errno, "failed to find non-opened console");
snprintf(filename, sizeof filename, "/dev/tty%d", wl->ttynr);
wl->tty = open(filename, O_RDWR | O_NOCTTY);
close(tty0);
}
在src / weston-launch.c中。
如果没有指定tty,它会尝试打开(&#39; / dev / tty0&#39;)并找到可用的tty。
但你不能这样做,也不能&#39; / dev / tty0&#39;也没有&#39;可用的tty&#39;属于你的。我用更简单的版本测试过。当然,我无法打开&#39; / dev / tty0&#39;。
你们知道这种魔法是如何完成的吗?感谢您的帮助:)
答案 0 :(得分:3)
If you're not the superuser then you should only try to access /dev/tty
. That is a special device synonym for whichever tty is controlling the current process.
答案 1 :(得分:2)
tty
的实际可用设备取决于系统。在大多数交互式Unix / Unix类系统中,您将拥有一个“tty”,其名称可以从命令行程序tty
中找到。例如:
$ tty
/dev/pts/2
可能你也有一个名为“tty”的设备,例如,
$ ls -l /dev/tty
lrwxrwxrwx 1 root other 26 Feb 9 2014 /dev/tty -> ../devices/pseudo/sy@0:tty
$ ls -lL /dev/tty
crw-rw-rw- 1 root tty 22, 0 Feb 9 2014 /dev/tty
您无法打开任何 tty设备,因为其中大多数设备都归 root (或已分配给他们的其他用户)所有。
有关/dev/console
,/dev/tty
和其他tty设备之间差异的进一步讨论,请参阅 NumberFormatInfo
。
根据DateTimeFormatInfo
手册页:
VT_OPENQRY
返回第一个可用(非打开)控制台。 argp指向一个int,它被设置为vt的编号(1&lt; = * argp&lt; = MAX_NR_CONSOLES)。
例如在Linux系统上我在/dev
中看到了这一点:
crw-rw-rw- 1 root 5, 0 Mon 04:20:13 tty
crw------- 1 root 4, 0 Mon 03:58:52 tty0
crw------- 1 root 4, 1 Mon 04:00:41 tty1
crw------- 1 tom 4, 2 Mon 04:30:31 tty2
crw------- 1 root 4, 3 Mon 04:00:41 tty3
crw------- 1 root 4, 4 Mon 04:00:41 tty4
crw------- 1 root 4, 5 Mon 04:00:41 tty5
crw------- 1 root 4, 6 Mon 04:00:41 tty6
crw------- 1 root 4, 7 Mon 03:58:52 tty7
crw------- 1 root 4, 8 Mon 03:58:52 tty8
crw------- 1 root 4, 9 Mon 03:58:52 tty9
crw------- 1 root 4, 10 Mon 03:58:52 tty10
crw------- 1 root 4, 11 Mon 03:58:52 tty11
除了我已打开控制台会话的设备之外的所有tty
设备都归 root 所有。为了能够登录,getty
等程序会暂时更改其所有权。在我的机器上执行ps
显示例如
root 2977 1 0 04:00 tty1 00:00:00 /sbin/getty 38400 tty1
root 2978 1 0 04:00 tty2 00:00:00 /bin/login --
root 2979 1 0 04:00 tty3 00:00:00 /sbin/getty 38400 tty3
root 2980 1 0 04:00 tty4 00:00:00 /sbin/getty 38400 tty4
root 2981 1 0 04:00 tty5 00:00:00 /sbin/getty 38400 tty5
root 2982 1 0 04:00 tty6 00:00:00 /sbin/getty 38400 tty6
请注意,getty
作为 root 运行。这使它有权根据需要更改tty设备的所有权。也就是说,虽然ioctl 可以识别未使用的tty,但您需要提升权限才能实际打开它。 Linux(像任何其他类Unix系统一样)没有办法确保一个进程具有对终端的真正独占访问权限。因此,它使用设备所有权和权限来确保此访问权限。