2010-09-02 39 views
4

Ou est-il possible que quelque processus ou autre chose puisse bloquer un terminal virtuel? Ou quelle pourrait être la raison pour laquelle une application se bloque en essayant d'accéder au VT1?Quelles sont les raisons possibles pour bloquer un terminal virtuel sous Linux?

Il semble, pendant ce temps, il est suspendu dans la fonction ioctl. Surtout, c'est le code qui échoue:

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

Il est dans la deuxième ioctl. Quand je l'interrompre, je reçois ce message:

VT_WAITACTIVE failed: Interrupted system call 

De plus, alors qu'il attend là, si je fais un chvt 1 d'un autre terminal, qui pèse aussi.

Répondre

4

J'ai découvert le problème. Linus Torvalds a d'abord described it dans une situation similaire. C'est en fait un race condition. Le problème est le suivant: S'il arrive que juste après la première ioctl(fd, VT_ACTIVE, 1) réussisse, c.-à-d. Que le système passe au premier VT, un autre processus séparé passe à un autre VT, le second ioctl échouera (ou attendra simplement pour toujours, c.-à-d. accrocher) car il attend que nous passions à VT1 que nous n'allons plus faire (sauf si l'utilisateur le fait).


Eh bien, cela l'explique à une partie. Cela n'explique pas pourquoi le chvt 1 est également suspendu.