什么可能的原因可以阻止在Linux上的虚拟terminal?

还是有可能一些进程或其他东西可以阻止虚拟terminal? 或者当尝试访问VT1时应用程序挂起的原因是什么?

看来,这一切正在发生,它挂在functionioctl 。 尤其是,这是失败的代码:

 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 

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

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

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


那么,这解释了一部分。 这并不能解释为什么chvt 1也挂了。