【问题标题】:What possible reasons could block a virtual terminal on Linux?哪些可能的原因会阻止 Linux 上的虚拟终端?
【发布时间】:2010-09-02 12:11:05
【问题描述】:

或者是否有可能某些进程或其他东西可能会阻塞虚拟终端?或者应用程序在尝试访问 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,它也会挂起。

【问题讨论】:

    标签: linux console ioctl tty


    【解决方案1】:

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

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


    嗯,这就解释了一部分。它没有解释为什么chvt 1 也挂了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2012-04-24
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多