Консультация № 68438
24.12.2006, 22:34
0.00 руб.
0 2 2
Добрых суток всем!

Дали мне задание сделать под Линуксом что-то типа чата, использую разделяемую память. Т.е. открываем две консоли, в каждой из них запускаем прогу. Теперь сообщения отправленные из первой должна вывести на экран вторая программа. И соответственно наоборот. Проблема одна. Как одноврмененно ждать от пользователя ввода текста и проверять не пришло ли сообщение от другой программы? Или же это не возможно?

Обсуждение

Неизвестный
24.12.2006, 23:02
общий
это ответ
Здравствуйте, Дмитриев Денис Юрьевич!
В программировании возможно все, кроме ИИ.

Реализовать можно несколько способами.
1) использовать неблокируемый ввод/вывод
2) использовать потоки

В первом случае через fcntl устанавливаем принимающему сокету и файловым дескрепторам ввода/вывода флаг O_NONBLOCK. В цикле проверяем состояния ввода (ввел ли что-нибудь пользователь или нет), а так же слушаем не пришло ли нам что-нибудь на сокет. Это достаточно сложно кодить нужно много, ну вообще не удобно.

Второй способ - с помощью потоков. Создается дополнительный поток для прослушки или ввода данных. Один поток слушает с помощью select не пришло ли что-нибудь, ну и выводит это дело. А второй обрабатывает ввод данных.

Все это побродно описано у Стивенса - unix:разработка сетевых приложений. Там и исходные коды есть и комментарии и куча другой полезной информации.
Неизвестный
25.12.2006, 03:32
общий
это ответ
Здравствуйте, Дмитриев Денис Юрьевич!

для этого испольщуется системный вызов select().
Есть множество примеров использования оного
Форма ответа