LinuxForum.Fans
Тема

getchar_unlocked()

Автор: Peter 9 сообщений 1553 просмотров
#276876

Здравствуйте!

В одной программе с использованием ncurses есть бесконечный цикл

text
while(getch()==ERR){
...
}

но мне надо без ncurses. Я попытался использовать

text
while(getchar_unlocked()<=0){

но эта функция всё равно блокирует поток. Я неправильно представляю её работу или в чём причина?
Или как надо добиться желаемого? Всякие попытки пока успеха не имели.

Пётр.

#276877

Ты хочешь просто бесконечный цикл?

#276892

Не просто, а чтобы он исполнялся, пока не будет нажата клавиша, как в исходном варианте.

Пётр.

#276921
"Peter" написал:
но эта функция всё равно блокирует поток. Я неправильно представляю её работу или в чём причина?

да, неправильно. согласно man'у они только не устанавливают блокировку на файл... с ними, в теории, могут быть проблемы в синхронизации процессов при доступе к одному файлу.
первое, что приходит в голову - это fcntl(0, F_SETFD, O_NONBLOCK) , а потом read() или может даже getchar() сработает....

#276929
Fat-Zer написал:
[quote="Peter"]но эта функция всё равно блокирует поток. Я неправильно представляю её работу или в чём причина?

да, неправильно. согласно man'у они только не устанавливают блокировку на файл... с ними, в теории, могут быть проблемы в синхронизации процессов при доступе к одному файлу.
первое, что приходит в голову - это fcntl(0, F_SETFD, O_NONBLOCK) , а потом read() или может даже getchar() сработает....[/quote]
Благодарю за разъяснение. Насчёт O_NONBLOCK я подумал, но я пытался открыть stdin
ещё раз с O_NONBLOCK с помощью open, но это не сработало.
Изменять свойства stdin не хотелось бы, лучше создать аналог kbhit. Он есть в libcaca
и работает, но при этом запускается какое-то окно.
Я сделал также поиск по "kbhit в Linux", нашёл вот это
http://hashcode.ru/questions/90125/c-%D0%BA%D0%B0%D0%BA-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-kbhit-%D0%B2-linux
Реализовывать ещё не пробовал, т.к. нет полного руководства по ioctl/ioctl_list,
но если нажимать не любую клавишу, а Enter, то достаточно одной ioctl из этой ссылки.

Пётр.

#276945

Ещё сделал поиск по "kbhit in Linux", нашёл вариант реализации с использованием select,
но и select и ioctl требуют наличия ядра Linux. Лучше был бы вариант, не требующий ядра,
чтобы работал, например, с newlib, но тогда, наверное, не обойтись без O_NONBLOCK.

Пётр.

#276949

есть же ещё poll()/select() просто установи timeout в 0....

"Peter" написал:
Насчёт O_NONBLOCK я подумал, но я пытался открыть stdin
ещё раз с O_NONBLOCK с помощью open, но это не сработало.
Изменять свойства stdin не хотелось бы,

создай просто небольшую обёртку...

"Peter" написал:
Я сделал также поиск по "kbhit в Linux", нашёл вот это
http://hashcode.ru/questions/90125/c-%D … 0%B2-linux
Реализовывать ещё не пробовал, т.к. нет полного руководства по ioctl/ioctl_list,
но если нажимать не любую клавишу, а Enter, то достаточно одной ioctl из этой ссылки.

обычно вместо conio.h как раз и используют (n)curses =)

#276972

В варианте с select и был timeout установлен в 0.
ncurses не хотел бы, желательно на C.
Насчёт обёртки попытаюсь понять.

Пётр.

#277742
"Peter" написал:
В варианте с select и был timeout установлен в 0.

там timeout должен указывать на нулевую структуру, а не сам равняться нулю...

да... ещё можно просто в ncurses реализацию посмотреть...

ЗЫ: с fcntl у меня чего-то не получилось...

Войдите или зарегистрируйтесь, чтобы ответить.