2010-09-02 40 views
4

还是有可能一些进程或其他东西可以阻止虚拟终端?或者当尝试访问VT1时应用程序挂起的原因是什么?什么可能的原因可能会阻塞Linux上的虚拟终端?

看来,虽然这是发生,它挂在功能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,也挂起。

回答

4

我发现了这个问题。首先在类似的情况下,Linus Torvalds有described it。它实际上是一个race condition

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


那么,这解释为一部分。它不能解释为什么chvt 1也挂。

相关问题