LINUX.ORG.RU

getchar() после перевода терминала в raw режим


0

0

Добрый день,
необходимо получать один символ с клавитуры, в течении, допустим, 5
секунд, если не получен - ждать следующие 5 секунд и так далее.

Один раз всё прекрасно работает:

static struct termios tosave;

is_char()
...
struct termios towork;
tcgetattr(0,&tosave);
memcpy(&towork,&tosave,sizeof(struct termios));

towork.c_cc[VTIME]=50;
towork.c_cc[VMIN]=0;
towork.c_lflag &= ~( ICANON | ECHO );

tcsetattr(0,TCSANOW,&towork);
result=getchar();
tcsetattr(0,TCSANOW,&tosave);
return result;
}


Однако в цикле, например,

for (i=0;i<20;i++){
printf ("%d ",i);
ch=is_char();
if (is_char != -1){
printf("Interupted\n");
return 1;
}
}

нормально ждет первые 5 секунд (и выходит при нажатии), а потом
сразу печатает 1...19.
Как я понял, с буфером stdin это никак не связано, подозреваю,
что дело в таймере; но ведь после считывания символа структура
termios полностью восттанавливается! Поиски подходящего примера в
google ничего не дали :(

★★
Ответ на: комментарий от Murr

Давай уточним, после прошествия пяти секунд он печатает "1" и
снова ждёт 5 секунд?

Впрочем, это уже чисто академический интерес,
поскольку с read(0,&result,1) работает как надо.
Я грешным делом на dietlibc грешил, но эффект и с libc сохраняется...

И ещё, спасибо, за счет убирания функции getchar() из stdio, dietlibc
выдала статический бинарник в 12 kb. Красота :)

octy ★★
() автор топика
Ответ на: комментарий от octy

>Давай уточним, после прошествия пяти секунд он печатает "1" и
>снова ждёт 5 секунд?

Да. При нажатии или таймауте сразу переходит на следующее ожидание.
Fedora Core 3.

Могу еще проверить на RedHat EL AS3.

Murr ★★
()
Ответ на: комментарий от Murr

Всё, спасибо, можешь не проверять. Это всё-таки dietlibc. Видимо я вчера на ночь глядя в Makefile напортачил, что эффект с libc воспроизводился. А теперь не воспроизводится :) Впрочем, оно и к лучшему, с read правильнее будет.

octy ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.