还是有可能一些进程或其他东西可以阻止虚拟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
也挂了。