Какие возможные причины могут заблокировать виртуальный терминал в Linux? - PullRequest
5 голосов
/ 02 сентября 2010

Или вообще возможно, что какой-то процесс или что-то еще может заблокировать виртуальный терминал?Или в чем может быть причина того, что приложение зависает при попытке доступа к 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 с другого терминала, он также зависает.

1 Ответ

5 голосов
/ 02 сентября 2010

Я обнаружил проблему. Линус Торвальдс описал это во-первых, в похожей ситуации. Это на самом деле состояние гонки .

Проблема заключается в следующем: если случится так, что сразу после успешного выполнения первого ioctl(fd, VT_ACTIVE, 1), т. Е. Система переключится на первый VT, другой отдельный процесс переключится на другой VT, второй ioctl завершится ошибкой (или просто подождет навсегда, т. е. зависание), потому что он ждет, что мы переключимся на VT1, что мы больше не собираемся делать (если пользователь не делает это).


Ну, это объясняет это одной части. Это не объясняет, почему chvt 1 также висит.

...