Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
boost::program_options, libev и ctrl+c
|
|||
|---|---|---|---|
|
#18+
Простите за мою тупость и лень самостоятельно разобраться, но может кто-то просто встречался с такой проблемой. Использую в консольном приложении boost::program_options вместе с libev. Вешаю на ev::sig колбэк для обработки SIGINT. В программе один поток. Все работает здорово, когда я запускаю приложение без параметров: по ctrl+c приложение благополучно завершается и отдает консоль для дальнейшей работы. Но если запустить, указав в командной строке параметры, то первый ctrl+c останавливает приложение, но процесс продолжает висеть после выхода из main (кажется его держит epoll), второй ctrl+c вырубает процесс окончательно. Как аргументы могут влиять на обработку сигнала? код см. ниже Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. так отлавливаю сигналы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. и так останавливаю приложение: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 15:42 |
|
||
|
boost::program_options, libev и ctrl+c
|
|||
|---|---|---|---|
|
#18+
darkstarxПростите за мою тупость и лень самостоятельно разобраться, но может кто-то просто встречался с такой проблемой. Использую в консольном приложении boost::program_options вместе с libev. Вешаю на ev::sig колбэк для обработки SIGINT. В программе один поток. Все работает здорово, когда я запускаю приложение без параметров: по ctrl+c приложение благополучно завершается и отдает консоль для дальнейшей работы. Сразу недоумевающий вопрос -- а зачем для того, чтобы по ctrl+c приложение благополучно завершилось и отдало консоль для дальнейшей работы, нужно вешать какие-то сигналы и использовать какую-то билбиотеку ? Это -- поведение С-шной программы по умолчанию. Вот чтобы приложение НЕ завершалось по Ctrl-C -- надо постараться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 17:00 |
|
||
|
boost::program_options, libev и ctrl+c
|
|||
|---|---|---|---|
|
#18+
darkstarx , возможно, приложение в этом случае действительно уходит в глубокий IO, из которого даже kill -9 иногда может не выводить. Но что-то я в этом немного сомневаюсь. Или что-то не так с логикой потока управления в случае, когда параметры есть. В любом случае, других идей у меня нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 17:07 |
|
||
|
boost::program_options, libev и ctrl+c
|
|||
|---|---|---|---|
|
#18+
MasterZivСразу недоумевающий вопрос -- а зачем для того, чтобы по ctrl+c приложение благополучно завершилось и отдало консоль для дальнейшей работы, нужно вешать какие-то сигналы и использовать какую-то билбиотеку ? Это -- поведение С-шной программы по умолчанию. Не, это мелочь, просто чтобы корректно деинициализировать сервис. Можно не ловить этот сигнал, тогда не вызовится Server::stop(), не выполнится деструктор Server::~Server() и не закроютя сокеты, не сдампится лог например какой-то, и всё такое, на что расчитана внутренняя логика этого класса и вообще сервиса. Если не перехватывать этот сигнал, то процесс завершается тут же :) Но я так не хочу. Хочу, при завершении выполнить ряд действий, но чтобы и дважды SIGINT не нужно было посылать процессу. Проблема именно в этом. MasterZivВот чтобы приложение НЕ завершалось по Ctrl-C -- надо постараться. Просто не останавливаем наш event loop при обработке этого сигнала (см. Server::signal_cb). Не знаю, правда зачем так делать. MasterZivвозможно, приложение в этом случае действительно уходит в глубокий IO, из которого даже kill -9 иногда может не выводить. Но что-то я в этом немного сомневаюсь. Или что-то не так с логикой потока управления в случае, когда параметры есть. Да, gdb указывает на подвисший epoll: Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. но я нуб в этом (( что за __epoll_wait_nocancel и чего он ждет?.. MasterZivВ любом случае, других идей у меня нет. Все равно спасибо за участие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 19:58 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=57&tid=2019286]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 174ms |

| 0 / 0 |
