或者是否有可能某些进程或其他东西会阻塞虚拟终端?或者什么可能是应用程序在尝试访问 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
,它也会挂起。
最佳答案
我发现了问题。 Linus Torvalds 有 described it首先在类似的情况下。它实际上是一个 race condition .
问题如下:如果恰好在第一个ioctl(fd, VT_ACTIVE, 1)
成功后,即系统切换到第一个VT,另一个单独的进程切换到另一个VT ,第二个 ioctl
将失败(或永远等待,即挂起),因为它等待我们切换到 VT1,我们不会再这样做(除非用户正在这样做)。
好吧,这解释了一部分。它没有解释为什么 chvt 1
也挂起。
关于linux - 哪些可能的原因会阻止 Linux 上的虚拟终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3633974/