可能的原因可能会阻止Linux上的虚拟终端?

时间:2010-09-02 12:11:05

标签: linux console ioctl tty

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

看来,虽然这种情况正在发生,但却悬挂在函数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,那也会挂起。

1 个答案:

答案 0 :(得分:4)

我发现了问题。 Linus Torvalds首先described it处于类似情况。它实际上是race condition

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


嗯,这可以解释为一部分。它没有解释为什么chvt 1也悬而未决。