LINUX.ORG.RU

C++ signal handler

 ,


0

1

А как это можно без boost asio? А то жирновато как-то для такой простой задачи.

https://stackoverflow.com/a/48164204

Как не смотришь, всё криво и косо. Вот есть экземпляр серверного класса в main, а как его загасить красиво?

UPDATE: вопрос про верхний уровень. Низ не интересует. Как пробросить контекст в обработчик, устанавливаемый с std::signal. Чтобы красиво было на C++, а не как всегда (рабочий код):

unique_ptr<StateChecker> myServer;
unique_ptr<thread> server_thread;
// DO NOT WANT GLOBAL VARIABLES!!!

void signal_handler(int signal_num) {
	if(myServer!=nullptr) {
		myServer->stop(); server_thread.join(); }
	exit(signal_num);
}


int main() {
// bla bla
	return 0;
}
★★★★★

Последнее исправление: fornlr (всего исправлений: 7)
Ответ на: комментарий от filosofia

Я правильно понимаю этот псевдокод, что, если в очереди нет сообщения, то мы будем ждать до секунды прежде чем выйдем из цикла? А если за это время сообщение таки появится, мы его еще и обработаем прежде чем выйти?

вы будете ждать «ивента» в течении указанного периода времени. в данном случае «ивент»- прибытие вам данных в очередь, оформленных в виде месседжа(если там их уже нет). если данные будут доступны, в данном случае за секунду, вам вернут - true. то есть месседж принять удалось. если не придут - false, то есть истек таймаут.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

Еще замечу, что васяно-реализация queue.get(lm, 1000) с огромной вероятностью выльется в потенциальную задержку в обработке некоторых сообщений до секунды. Но это зависит.

filosofia
()
Ответ на: комментарий от alysnix

То есть ответ на оба моих вопроса — да. Пока что не очень получается, надо дорабатывать %)

PS Если что, я имел в виду кейз установки флага выхода в true. Тут уже я говорил с кем-то в своей голове, признаю.

filosofia
()
Последнее исправление: filosofia (всего исправлений: 2)
Ответ на: комментарий от filosofia

Пока что не очень получается, надо дорабатывать %)

проверьте перед handleMessage стопреквест еще раз. поскольку было ожидание. сильно быстро писал. проверять надо перед попыткой читать мессагу с таймаутом, и перед handleMessage. потому что это две точки, где важно проверить этот реквест

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

Еще замечу, что васяно-реализация queue.get(lm, 1000) с огромной вероятностью выльется в потенциальную задержку в обработке некоторых сообщений до секунды. Но это зависит.

реализация тредсейф очереди с таймаутом… это типа классика вообще. не может там быть никаких «задержек». там используется ожидание на condvar с таймаутом. естессно кондваров без таймаутов не бывает.

ну например - https://en.cppreference.com/w/cpp/thread/condition_variable/wait_for

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

То есть у тебя есть очередь с condition variable, поверх которой ты лепишь булевый флаг на выход. Ты уверен, что все делаешь правильно?

естессно кондваров без таймаутов не бывает

https://en.cppreference.com/w/cpp/thread/condition_variable/wait xD

filosofia
()
Последнее исправление: filosofia (всего исправлений: 1)
Ответ на: комментарий от alysnix

Теперь перечитай мое стартовое сообщение, против которого ты начал воевать:

Многопоточная хня: condition_variable.

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

https://en.cppreference.com/w/cpp/thread/condition_variable/wait xD

это для дурачков штучка. поскольку отвал того или тех, кто пишут в очередь - вполне себе реальность и этот случай надо обрабатывать и реагировать на него.

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

в реальности такие мессаги могут слаться с другого компа, по tcp, под tls соединением, читать их физически будет совсем другой тред-ридер, и забрасывать этому в очередь, и вообще транспорт мессаг тут никак не специфицирован. и если произошел отвал на этом пути, система нормально отреагирует руганью, а не застрянет навсегда.

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

Сигналы - это не про многопоточность, а про процессы. Обработчик сигналов надо делать в отдельном процессе-мониторе. А сервер с многопотоком - в отдельном, который не знает про существование сигналов. И пусть монитор общается с сервером-процессом, используя сообщения как клиент.

Ура, свершилось - вы и @alysnix нашли друг друга! Ну, а мы запасаемся попкорном к надежде увидеть развитие симбиоза ваших бредовых теорий. Show must go on :)

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

Раньше с тобой свершилось.

Я завязал. Человек живёт в своём мирке полностью оторванном от реальности, зациклен на вусмерть пересинхронизованных очередях считая их чуть ли не самым гениальным изобретением последних 100 лет, и проповедует их на каждом шагу. На разумные доводы не реагирует. Я теперь только наблюдаю. Местами бывает весело :)

Вы кстати не сильно лучше. Мне теперь что, чтобы нормально потушить свой серверный процесс который форкнул пару background тредов нельзя сигналы использовать? Бред же. В общем поехали - @alysnix вас ждёт.

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

Во-первых, ты не дочитал: «Если надо более-менее некостыльно и не сильно вылезая за рамки c++».

чтобы нормально потушить

Что такое «нормально»?

Исторический факт: потоки в unix/posix появились позже сигналов

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

Во-первых, ты не дочитал: «Если надо более-менее некостыльно и не сильно вылезая за рамки c++».

Ну, некостыльно не получится я думаю, хотя может чего уже и завезли в стандарт чтобы сделать «удобнее». Только оно нафиг не надо - работы с гулькин хрен по любому, и всё уже у всех давно написано, и только ради красоты никто будучи в своём уме рабочий код трогать не будет.

Что такое «нормально»?

Чтобы я сказал kill <pid> и он мне gracefully закрыл все файлы, соединения, gracefully потушил все background треды итд и чистенько вышел из main() вместо того чтобы тупо провалиться в exit()/terminate() непонятно откуда. Мне много не надо.

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

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

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

https://en.wikipedia.org/wiki/Message_queue

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

Какого процесса? Этих процессов можно наплодить с таким же успехом, сколько «background тредов».

anonymous
()
Ответ на: комментарий от alysnix

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

Буковок то сколько. И вот эти вот все усилия только ради меня? Не, я польщён конечно. Но… А я просил?

This page was last edited on 30 April 2021, at 11:46 (UTC).

На тот момент я даже не подозревал о вашем существовании. И что-то среди editors я тоже вас не замечаю.

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

Буковок то сколько. И вот эти вот все усилия только ради меня? Не, я польщён конечно. Но… А я просил?

лучше скажите - статья понравилась? ну красивое вступление жеж!?

In computer science, message queues and mailboxes are software-engineering components typically used for inter-process communication (IPC), or for inter-thread communication within the same process. They use a queue for messaging – the passing of control or of content. Group communication systems provide similar kinds of functionality.

The message queue paradigm is a sibling of the publisher/subscriber pattern, and is typically one part of a larger message-oriented middleware system.

не, ну там еще интересные куски есть…

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

Какого процесса? Этих процессов можно наплодить с таким же успехом, сколько «background тредов».

«Мой» процесс. Я уж конкретный нужный мне как-нибудь опознаю. Я как-то в курсе что на моих машинках творится, кроме моего софта там ничего нет.

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

«Мой» процесс.

кроме моего софта там ничего нет.

«Чужих» нет, все «мои».

anonymous
()
Ответ на: комментарий от alysnix

лучше скажите - статья понравилась? ну красивое вступление жеж!?

Наискосок просмотрел. Вчитываться в это мне не интересно.

In computer science,

Ну, вот пускай теоретики и др^wмоляться на эти очереди «ивентов». А я практик, и прагматик до мозга костей. Мне нужно «чтобы работало», и причём «работало быстро быстро», и миллион лишних абстракций только удаляющих меня от железа мне нахрен не нужен. И даже думать в терминах этих абстракции мне неудобно если это не соответствует тому как оно внутри устроено.

В общем - отстаньте со своими очередями от меня уже. Реально надоело.

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

Они выполняются через longjmp, нарушая состояние вложенности

Только если явно попросить об этом через sigaltstack. Проблема с сигналами в том, что они обрабатываются асинхронно и могут прервать исполнение программы в любой момент, в том числе, когда этого не ожидаешь (самый простой пример где-то между pthread_mutex_lock и pthread_mutex_unlock внутри одной функции). Поэтому желательно, чтобы в самом обработчике как можно меньше всего происходило.

Максимум, что тебе разрешено делать в обработчиках, это вот так:

На самом деле, дофига всего разрешено (man signal-safe)

Я в шоке с того, что единственный анонимус в треде указал на signalfd, а регистранты пошли нести истину родом из 90-х.

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

Я в шоке с того, что единственный анонимус в треде указал на signalfd, а регистранты пошли нести истину родом из 90-х.

Вещь, конечно, интересная (и честно скажу - я про нее не знал), но не очень практичная и удобная. ПисАть придётся больше чем по старинке, и непонятно ради чего. И может быть я вообще не в select()/epoll_wait() сплю? Тогда ещё и довольно бесполезная.

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

«Истина» универсальная, для нее хватит 1 потока (а можно и вовсе опрашивать в цикле с O_NONBLOCK, хоть это и bad practice). Городить же поллы исключительно для signalfd, как уже отметил @bugfixer, смысла никакого нет.

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

И может быть я вообще не в select()/epoll_wait() сплю?

У меня при слове «серверный класс» первая ассоциация «event loop», потому что как же иначе этот серверный класс будет общаться с миром?

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

У меня при слове «серверный класс» первая ассоциация «event loop», потому что как же иначе этот серверный класс будет общаться с миром?

Вариантов много. Event loop точно будет, но не факт что он спит на fd. Может быть conditional variable, может семафор какой, или futex (например если реагируем на события передающиеся через SHM). Вариантов много. А может быть это вообще polling. По разному бывает, и от задачи зависит.

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

Вариантов много

Расскажи мне больше о вариантах связи приложения со внешним миром, исключающих файловые дескрипторы.

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

исключающих файловые дескрипторы.

«Всё есть файл»

anonymous
()
Ответ на: комментарий от bugfixer

man sysvipc

То есть, внешний мир за пределы локалхоста никак не отсвечивает? Ну ок, такое тоже возможно, но все же довольно экзотично.

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

То есть, внешний мир за пределы локалхоста никак не отсвечивает? Ну ок, такое тоже возможно, но все же довольно экзотично.

Речь шла о том что серверный процесс не обязан спать на fd.

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

а он еще главный программист… хотя даже я до него дослужился

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

Не могу не поприветствовать «четырехзначного» собрата :-)

Как ты это сделал! Владимир погрузился в фрустрацию.

А вообще, кокой он тебе собрат? У него вон сколько звезд!

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