2010-09-02 37 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也掛。

相關問題