可能的原因可能会阻止Linux上的虚拟终端?
发布时间:2020-12-13 23:00:08 所属栏目:Linux 来源:网络整理
导读:或者是否有可能某些进程或其他东西可以阻止虚拟终端?或者在尝试访问VT1时应用程序挂起的原因是什么? 看来,虽然这种情况正在发生,但它仍然悬挂在函数ioctl中.特别是,这是失败的代码: int vtno = 1;const char* vtname = "/dev/tty1";int fd = open(vtname,
或者是否有可能某些进程或其他东西可以阻止虚拟终端?或者在尝试访问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: %sn",strerror(errno)); if (ioctl(fd,VT_WAITACTIVE,vtno) < 0) printf("VT_WAITACTIVE failed: %sn",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也悬挂了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |