如何在C

时间:2015-05-17 08:44:04

标签: c tty

我正在阅读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;。

你们知道这种魔法是如何完成的吗?感谢您的帮助:)

2 个答案:

答案 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系统一样)没有办法确保一个进程具有对终端的真正独占访问权限。因此,它使用设备所有权和权限来确保此访问权限。