有什么可能的原因可能会阻塞Linux上的虚拟终端?

Alb*_*ert 5 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));
Run Code Online (Sandbox Code Playgroud)

它挂在第二个ioctl。当我中断它时,我收到以下消息:

VT_WAITACTIVE failed: Interrupted system call
Run Code Online (Sandbox Code Playgroud)

另外,当它在那里等待时,如果我chvt 1从另一个终端进行操作,那也会挂起。

Alb*_*ert 5

我发现了问题。Linus Torvalds 首先在类似情况下对此进行了描述。这实际上是一种比赛条件

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


好吧,这可以解释为一部分。它没有解释为什么chvt 1还挂了。