5

或者是否有可能某些进程或其他东西可能会阻塞虚拟终端?或者在尝试访问 VT1 时应用程序挂起的原因可能是什么?

似乎,在发生这种情况时,它挂在了 function 中ioctl。特别是,这是失败的代码:

int vtno = 1;
const char* vtname = "/dev/tty1";

int fd = open(vtname, O_RDWR|O_NDELAY, 0);

if (ioctl(fd, VT_ACTIVATE, vtno) < 0)
  printf("VT_ACTIVATE failed: %s\n", strerror(errno));

if (ioctl(fd, VT_WAITACTIVE, vtno) < 0)
  printf("VT_WAITACTIVE failed: %s\n", strerror(errno));

它挂在第二个ioctl。当我打断它时,我收到以下消息:

VT_WAITACTIVE failed: Interrupted system call

此外,当它在那里等待时,如果我chvt 1从另一个终端执行,那也会挂起。

4

1 回答 1

5

我发现了问题。Linus Torvalds在类似的情况下首先对其进行了描述。它实际上是一个竞争条件

问题如下:如果发生在第一个ioctl(fd, VT_ACTIVE, 1)成功之后,即系统切换到第一个 VT,另一个单独的进程切换到另一个 VT,第二个ioctl将失败(或永远等待,即挂起),因为它等待我们切换到 VT1,我们将不再这样做(除非用户正在这样做)。


好吧,这解释了它的一部分。它没有解释为什么chvt 1也挂起。

于 2010-09-02T18:28:50.327 回答