![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Есть кросс платформенное консольное приложение. Нужно научить его реагировать на событие из вне. Одно единственное.
В линуксе можно заюзать сигналы и например SIGUSR1. понятие не имею как это сделать в винде. Это событие нужно уметь посылать из командной строки. PS. Про SIGUSR1 пишут что то не совсем понятное в случае много поточности, что мол его нельзя использовать если приложение многопоточное. Но я как то не увидел почему и чем заменить... |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
В юниксах для таких вещей сейчас есть сокеты.
В виндах тожэ, в общем, есть -- но только ipv4 с вытекающим ограничением на пространство имён. Да, а SIGUSR в многопоточных приложэниях использовать вполне реально. Уж не сложнее, чем писать правильное многопоточное приложэние. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
cupper, юзай локальные сокеты или IPC.
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
В принципе, помимо сокетов и пр. возможны ещё варианты: 1/ в консольном приложении создать именованное событие и висеть на нём, а в специальном приложении (запускаемом из командной строки) делать SetEvent 2/ в консольном приложении можно поставить обработчик особых событий SetConsoleCtrlHandler, а потом просто жать ^C или ^Break, а в обработчике коректно отлавливать это событие; при необходимости можно в консольный процесс послать ^C или ^Break программно. Это сообщение отредактировал(а) feodorv - 29.2.2012, 15:34 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| cupper |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Что то я не как не осмыслю локальные сокеты. Нигде не могу найти описание что это и как это. Так же в бусте не могу понять где они... подскажите ?
Добавлено @ 10:12
^C и так ловится что бы корректно завершать работу. Не стоит использовать вещи не по назначению. Нужно обойти без написани доп. апликухи для того что бы послать "сигнал".
Вполне реально ? А при каких случаях не реально ? Что такое правильное много поточное приложения ? Что такое неправильное ? Это сообщение отредактировал(а) cupper - 1.3.2012, 10:15 |
||||
|
|||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
А кто будет отдавать этот сигнал (реализацию пока не обсуждаем)? Приложение, находящееся на это-же компьютере? Аппаратный какой-нить сигнал? Приложение, но по сети?
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Попробуйте задействовать fifo (через mkfifo) на Linux, и named pipe на Windows. Код реализации в приложении конечно будет разный (его можно засунуть под #ifdef), а с командной строки будет выглядить приблизительно одинаково:
PS. Вот тест для WIndows -
|
||||
|
|||||
| cupper |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Спасибо за пример с pipe, думаю можно/нужно переварить. Я правильно понимаю что это блокирующая операция ReadFile(srv_obj_handle,b,128,&cnt,NULL); и что она сработает когда мы файл что то запишем ? echo 1 > \\.\pipe\your_pipe_name А если мне корректно нужно прервать эту операцию мне нужно просто закрыть pipe через хендлер ?
человек с из командной строки. |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
если интересует только наступление события, без дополнительной информации, то целый пайп не нужен, хватит... м... события
CreateEvent/OpenEvent спасет гиганта мысли -------------------- Обижено школьников: 8 |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Ха, такое решение почему-то не устраивает:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
для меня новость что можно сдлелать echo в пайп по имени пайпа в nt-пространстве. Я считал что нужно как минимум сделать пайпу CreateDosDevice Ну у него же консольное приложение, моржет сделать параметр командной строки по которому прога будет устанавливать эвент и сразу выходить. Добавлено через 7 минут и 17 секунд простите, стормозил, оно уже примонтировано куда следует -------------------- Обижено школьников: 8 |
|||
|
||||
| cupper |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
А можете подсказать зачем тут явно создается SECURITY_ATTRIBUTES ? Пытался понять чего такого особенного задается в ней но так и не понял. Много где встречал что ее обычно NULL'ом заменяют. Чем дефолтные права не подходят ? |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Если его не задать, то берется значение по умолчанию:
Это сообщение отредактировал(а) xvr - 6.3.2012, 13:18 |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
что то оно работает не так как ожидалось
Блокирующей явлется операция ConnectNamedPipe и на ней зависаем до тех пор пока в пайп из консоли не запишем что нить. А вот операция ReadFile если есть данные читает их, если нет, позвращает управление, т.е. как будто мы установили флаг PIPE_NOWAIT |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
да но это взывает другие проблемы. Условие изменилось и теперь нужно иметь возможность обработать "сигнал", и опять начать слушать его. Для этого единственно что пришло в голову закрывать pipe (CloseHandle), и создавать заново. Потом обнаружилась функции - DisconnectNamedPipe. Но не та не другая не могут прервать ожидание ConnectNamedPipe, а это уже странно. И пока что то у меня эти pipe вызывают только огорчение. Это сообщение отредактировал(а) cupper - 6.3.2012, 22:11 |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Чет не как немогу врубиться в OVERLAPPED.
Таки осилил
Это сообщение отредактировал(а) cupper - 6.3.2012, 23:01 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |