linux - 哪些可能的原因会阻止 Linux 上的虚拟终端?

标签 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));

它卡在第二个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/

相关文章:

linux - 使目录的标题成为 bash 中的日期?

python - Azure Linux Web 应用程序(startup.sh : not found)

c# - 在 C# 中检查标准输入

linux - 用于 azure 云服务的 nix 操作系统

linux - Jenkins 和 Sonar - 如何在 Linux 上使用 Sonar Runner(因为它只有一个 .bat 执行器)

java - Kafka 连接什么时候需要 ZooKeeper 配置?

java - 带有参数和类路径变量的 Jar 文件

linux - Linux 中的异步套接字——轮询与回调

c - SPI(串行端口通信)问题,卡在 ioctl() 上

linux - IOCTL:仅适用于 switch-case 中的参数 0