LINUX.ORG.RU

Signalhandling в процессах


0

0

Привет

у следующая проблема - я хочу изменить выполнение программы по какому-нибуть событию (передаеться через сигнал) таким образом чтоб сама программа *СРАЗУ* прервалась и выполнила нужную функцыю. Вопрос: как это реализовать? Проблема состоит в том что выполнение долгих функцый (таких как speep(X)) в *САМОМ* signal-handlere не допустимо.

пример программы:

void my_signalhandler(int s){ KEEP_RUNNUNG=0; }

... while( KEEP_RUNNING ){ /* main loop */ do_something(); /* функция блокируется на ... неопределенное время */ } do_when_signal_comes();/* должно быть запущено по сигналу и требует длительного времени выполнения*/ ...

В этом примере проблема состоит в том что выполнение программы прерывается не после сигнала (и вызова handlera), а только после проверки KEEP_RUNNING в главном цыкле. Существуют ли какие либо методы асинхронного прерывания программы? Или может ктонибуть посоветоваеть что нибуть еще, Всем заранее благодарен!


сорри, с форматом вышел касяк, а исправить сообщение не удается, поетому еще раз:

пример программы:

void my_signalhandler(int s){
KEEP_RUNNUNG=0;
}

...
while( KEEP_RUNNING ){ /* main loop */
do_something(); /* функция блокируется на
... неопределенное время */
}
do_when_signal_comes();/* должно быть запущено по сигналу и требует
длительного времени выполнения*/
...

xerc
() автор топика
Ответ на: комментарий от Deleted

При чем тут mutexы?
Мне нужно найти метод передать управление программы в нужную функцию по сигналу.

P.S. я вообще то работаю не с threadами а с процессами..так что mutexы совсем не к месту.

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

а всеже на каком вызове блокируеться программа, или выполняется какой либо длинный цикл? Если в функции происходит блокирование системным вызовом, то он после сигнала обрываеться (или нет смотреть SA_RESTART) а если цикл то в нем и проверять дополнительно переменную.

и кстати незыбавайте объявлять такую переменную как volatile

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

Дело в том что я даже не знаю в каком вызове блокируется программа, так как я вызываю API-функцию Net-SNMP

agent_check_and_process(1)

выполнение этой функции прерывается ТОЛЬКО обработкой очередного NSNMP-PDU пакета (например входе snmpget/set)

Так как пока мое приложение получит новый SNMP-пакет может пройти много времени, я ищу возможност прервать это операцию асинхронно. (После вызова моего сигнал-хэндлера agent_check_and_process продолжает выполнение далее)
Возможен вариант SA_RESTART внутри agent_check_and_process на какой либо IO-операции, но изменение кода Net-SNMP кажется мне слишком серьёзной мерой;)

Есть у кого еще варианты асинхронного прерывания?

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

> я вообще то работаю не с threadами а с процессам

Может зря?

Информации не очень много, но нити кажутся довольно уместными.

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

> Есть у кого еще варианты асинхронного прерывания?

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

// wbr

klalafuda ★☆☆
()

семафоры?

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

каким образом треды могут помочь мне в асинхронном прерывании?

xerc
() автор топика

Треды тебя спасут, явно.

Делаешь два треда - один с главной программой, второй - с "длинным сигналом". По приходу сигнала суспендишь первый, рестартишь второй. Последняя операция "длинного сигнала" - пробуждение основного треда.

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