Вопрос про POSIX-сигнал

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Zeus
Сообщения: 694

Вопрос про POSIX-сигнал

Сообщение Zeus »

Есть такой код:

Код: Выделить всё

#include <signal.h>
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

void
timerHandler (int _event)
{
 printf ("Событие. Засыпаю.\n");
 sleep (1);
 printf ("Проснулся");
}

int
main ()
{
 struct sigaction action;
 action.sa_handler = timerHandler;
 sigaction (SIGALARM, &action, 0);
 itimerval timerSet;
 timerSet.it_interval.tv_sec = 0;
 timerSet.it_interval.tv_usec = 100000;
 timerSet.it_value.tv_sec = 1;
 timerSet.it_value.tv_usec = 0;
 setitimer (ITIMER_REAL, &timerSet, NULL);
 while (1);
 return 0;
}


Суть в следующем: обработчик сигналов таймера "работает" дольше, чем приходит следующий сигнал.
На экран выводятся только строчки: "Событие. Засыпаю."
А "Проснулся" - не появляется.
Если же вместо sigaction'а использовать signal, то код после sleep'а выполняется, но этот sleep задерживает обработку сигналов. Т.е. фактически функция вызывается не с частотой "щёлкания" таймера, а с когда завершается предыдущий её вызов, а события таймера, получается, накапливаются.

Поведение при signal'е меня не устраивает.
То как происходит обработка сигнала при sigaction'е тоже не совсем то что я ожидал, но ладно, это я семафорами обойду (всё-равно реальная обработка сигнала будет не в timerHandler, а в отдельном потоке), но вот вопрос остаётся: почему обработчик не возвращается из sleep'а?

Всякими SA_флагами играл (правда по-одиночке, может их в комбинации нужно использовать?).

Что скажете коллеги?
Спасибо сказали:
Sfunx
Сообщения: 47

Re: Вопрос про POSIX-сигнал

Сообщение Sfunx »

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

Итак имеем:
1. Поток событий (неважно каких, в данном случае от таймера).
2. Обработчик (подпрограмма), который обрабатывает событие.

Тут могут быть три ситуации:
с1. Обработчик должен немедленно обработать событие с минимальной задержкой . То есть от поступления события до его обработки должно пройти время не больше заданного. В этом случае требования к обработчику наиболее жесткие. Время выполнения обработчика ни в каком не должно превышать МИНИМАЛЬНОЕ время между соседними событиями.

с2. Обработчик должен обработать все события, но время реакции на событие (то есть от поступления события до его обработки) - некритично. В этом случае требования к обработчику гораздо менее жесткие. Время выполнения обработчика ни в каком не должно превышать СРЕДНЕЕ время между соседними событиями. Обычно в таком случае события выстраиваются в очередь и покорно ждут, пока обработчик их эээ... обработает. Как раз то, что происходит при signal в твоем примере.

с3. Обработчик может пропускать события. Такая ситуация тоже бывает, когда важен факт, что события вообще были, но одно или много - неважно. Тут обработчик вообще может выполняться сколь угодно (в разумных пределах конечно) долго по сравнению с интервалом между событиями.
Насколько я знаю (но я могу ошибаться, опыта в конкретном вопросе применительно к Линуксу у меня не много), в линуксе не предусмотрена подобная ситуация (да и вообще ее лучше избегать). Вполне возможно, что изза повторного прихода события во время выполнения обработчика происходит чтото.

Резюме:
При проектировании обработчиков сигналов, стремитесь либо к с1 либо к с2, избегайте с3.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

Sfunx писал(а):
22.02.2006 08:51
Скажу, что чтобы решить задачу - надо ее правильно поставить.
То есть, конечно теоретически такая ситуевина, как у тебя может быть, но практически - ее надо избегать.

У меня обработчик-то будет коротким: семафор будет дёргать и всё.
А реальная (и возможно долгая) обработка сигнала будет в потоке, который висит заблокированным на этом семафоре.
Т.е. тут-то всё в порядке.
Вопрос в другом:
По выводу на экран видно, что процедура обработки сигнала вызывается до завершения себя самой в предыдущей обработке. Т.е. события не скапливаются, а нормально отдаются на обработку.
Но почему при повторном входе в процедуру обработки предыдущий вызов не возвращается из sleep'а?
Кстати, надо попробовать вместо sleep'а вставить программную задержку (какой-нибудь длинный цикл).
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Интересные результаты иногда дает чтение манов :D Например почитайте man setitimer раздел bugs :) ИМХО - как раз ваш случай ;)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

d_Sun писал(а):
22.02.2006 11:36
Интересные результаты иногда дает чтение манов :D Например почитайте man setitimer раздел bugs :) ИМХО - как раз ваш случай ;)

Чем же это мой случай?
У меня как-раз события от таймера не теряются - они приходят, но выполнение обработчика события прекращается на sleep'е.
Вот если вместо sigaction использовать signal, тогда действительно похоже на то, что события теряются (хотя считал, что они не теряются, а, типа, в очередь выстраиваются).
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Пожалуйста еще раз четко опишите, что происходит по signal и sigaction. У меня по sigaction не прерывается сигналом, а спит положенное время.
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

d_Sun писал(а):
22.02.2006 12:32
Пожалуйста еще раз четко опишите, что происходит по signal и sigaction. У меня по sigaction не прерывается сигналом, а спит положенное время.

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

sigaction:
строки "Событие. Засыпаю" появляются с частотой сигнала.
строка "Проснулся" не появляется вообще.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Интересно... Код по signal в студию. И по sigaction, вы тестируете приведенный код, или уже с изменениями?

Вообще sleep должен прерываться сигналом, но у меня этого не происходит! В конце концов просто игнорируйте SIGALRM до завершения обработчика...
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

d_Sun писал(а):
22.02.2006 13:21
Интересно... Код по signal в студию. И по sigaction, вы тестируете приведенный код, или уже с изменениями?

Вообще sleep должен прерываться сигналом, но у меня этого не происходит! В конце концов просто игнорируйте SIGALRM до завершения обработчика...

С signal'ом код абсолютно такой же, только вместо
sigaction (SIGALRM, &action, 0);
написано
signal (SIGALRM, timerHandler);

Ну и инициализация структуры sigaction тоже не нужна:
struct sigaction action;
action.sa_handler = timerHandler;

ЗЫ: Кто придумал назвать структуру и функцию одним именем?!

Игнорировать SIGALRM до завершения обработчика мне как-раз не надо! Мне и нужно не потерять события таймера.
Просто интересно, куда девается уснувший поток обработчика сигнала, не успевший проснуться ДО прихода нового сигнала?
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Вообще-то POSIX гарантирует, что sleep() - async-signal safe, это значит, что нифига она не прерывается по SIGALRM, а вот printf к signal safe функциям не относится - делайте выводы.

З.Ы. И uname -a покажите пожалуйста.
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

d_Sun писал(а):
22.02.2006 14:29
Вообще-то POSIX гарантирует, что sleep() - async-signal safe, это значит, что нифига она не прерывается по SIGALRM, а вот printf к signal safe функциям не относиться - делайте выводы.

З.Ы. И uname -a покажите пожалуйста.

Так sleep и не прерывается. Она - не возвращает управление (судя по выводам в stdout).
Тоже немного грешу на нереентабельность (так вроде?) стандартной библиотеки, но что-то кажется мне дело не в этом.
Иначе, почему ДО sleep'а всё печатается?

uname -a такова:
Linux zeus 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Zeus писал(а):
22.02.2006 14:42
Так sleep и не прерывается. Она - не возвращает управление (судя по выводам в stdout).


:) Ну вы загнули - "выводы по stdout" :D . Прерываться может printf - и никаких "выводов" мы не увидим, при этом sleep() прекрасно отработает :) Кстати errno после sleep() , было бы не плохо проверить...

Zeus писал(а):
22.02.2006 14:42
uname -a такова:
Linux zeus 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux


Ну, а вот с этого надо было и начинать. В ранних версиях ядра, скорее всего ( не уверен ), syscalls wait() и pause() - прерывались сигналами. Поэтому и результаты у нас разные...
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

d_Sun писал(а):
22.02.2006 14:54
:) Ну вы загнули - "выводы по stdout" :D . Прерываться может printf - и никаких "выводов" мы не увидим

Это-то понятно - я и кивнул в сторону стандартной библиотеки.
Но почему это printf прерывается ТОЛЬКО после sleep'а?

Кстати errno после sleep() , было бы не плохо проверить...

Это можно. Дома только уже.

В ранних версиях ядра, скорее всего ( не уверен ), syscalls wait() и pause() - прерывались сигналами. Поэтому и результаты у нас разные...

Ну хорошо, прерывается sleep, а почему уснувший поток после того как sleep прервали управление не получает?
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Zeus писал(а):
22.02.2006 15:04
Ну хорошо, прерывается sleep, а почему уснувший поток после того как sleep прервали управление не получает?


Что значит не получает управление? Вы же говорите что первый printf ( до sleep ) выполняется!
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

d_Sun писал(а):
22.02.2006 15:20
Zeus писал(а):
22.02.2006 15:04

Ну хорошо, прерывается sleep, а почему уснувший поток после того как sleep прервали управление не получает?

Что значит не получает управление? Вы же говорите что первый printf ( до sleep ) выполняется!

Я говорю: уснул поток, пусть sleep прервали сигналом - почему поток не продолжает работу? То что ПОСЛЕ sleep'а не выполняется же!
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Zeus писал(а):
22.02.2006 16:21
Я говорю: уснул поток, пусть sleep прервали сигналом - почему поток не продолжает работу? То что ПОСЛЕ sleep'а не выполняется же!


Какой поток? Уж не думаете ли вы, что ваш signal handler это отдельный поток?

1. Ваш хендлер ловит SIGALRM.
2. sleep()
3. sleep() прерывается по SIGALRM. ( что происходит тут с сигналом не знаю, то ли он ставится в очередь на доставку и вы опять ловите его в хендлере, то ли отбрасывается - тогда в хендлере вы ловите следующий SIGALRM сгенерированны вашим таймером - в принципе, в данном контексте это не важно )
4. goto 1.

Вот поэтому второй printf и не выполняется...
Вместо sleep() - delay ( 500 ), и по идее, выполнится ваш второй printf.

З.Ы. Я мог где-то ошибиться т.к. не обладаю хорошими знаниями ядра Linux... so поправьте меня гуру :)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

Я говорю: уснул поток, пусть sleep прервали сигналом - почему поток не продолжает работу? То что ПОСЛЕ sleep'а не выполняется же!

Какой поток? Уж не думаете ли вы, что ваш signal handler это отдельный поток?


А как он реализован? Не тот же, который в while (1) висит? Значит отдельный.

1. Ваш хендлер ловит SIGALRM.

И что значит "ловит"?
Запускается функция, которую я указал как обработчик сигнала?
Она же в отдельном потоке работает по отношению к while (1) в main?
А когда предыдущая не завершила работу и сигнал опять пришёл - опять отдельный поток?
Если бы обработка сигналов была однопоточной (типа, работает цикл забирает сигналы, вызывает функции), то тогда всё работало бы как в версии с signal. Но ведь sigaction работает по другому!

2. sleep()

Поток (какой бы он там не был - отдельный или нет) уснул.

3. sleep() прерывается по SIGALRM.

Выполнение уснувшего потока должно быть возобновлено - так или нет?

Вместо sleep() - delay ( 500 ), и по идее, выполнится ваш второй printf.

Вот я и говорю, что нужно попробовать вставить _программную_ задержку.
Если она отработает по другому, то значит дело в sleep'е.
Вечером дома попробую.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

Zeus писал(а):
22.02.2006 17:10
А как он реализован? Не тот же, который в while (1) висит? Значит отдельный.


Какой нах :angry: отдельный? ps -eLf | grep имя_процесса чего говорит?
Вы посмотрите на ваш код!

action.sa_handler = timerHandler;


Что это? Создание нового потока? Нет!!! Это передача указателя на ваш хендлер!!! Он будет вызываться, даже если вы на двух while(1) заблокируетесь...

И что значит "ловит"?
Запускается функция, которую я указал как обработчик сигнала?


ДА.

Она же в отдельном потоке работает по отношению к while (1) в main?


:frusty: НЕТ

А когда предыдущая не завершила работу и сигнал опять пришёл - опять отдельный поток?


НЕЕЕЕЕТ!!!

Если бы обработка сигналов была однопоточной (типа, работает цикл забирает сигналы, вызывает функции), то тогда всё работало бы как в версии с signal. Но ведь sigaction работает по другому!


In the POSIX base standard, a signal handler is an ordinary function that returns void and has one integer parameter. When the operating system delivers the signal, it sets this parameter to the number of the signal that was delivered.


2. sleep()

Поток (какой бы он там не был - отдельный или нет) уснул.

Выполнение уснувшего потока должно быть возобновлено - так или нет?



Угу, но вы ему не даете этого сделать :)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вопрос про POSIX-сигнал

Сообщение Zeus »

[quote]
[quote]
А как он реализован? Не тот же, который в while (1) висит? Значит отдельный.
[quote]
Какой нах :angry: отдельный? ps -eLf | grep имя_процесса чего говорит?
Вы посмотрите на ваш код!
[quote]
1. Не нервничайте Вы так, а то напоминаете наших админов, когда к ним с пустяковым вопросом обращаешься.
2. Я не говорю, что моя программа создаёт отдельный поток.
Но согласись, что моя функция main, закрученная в while(1) никакие сигналы не обрабатывает.
Т.е. они обрабатываются В ДРУГОМ потоке.
В каком именно и откуда он берётся - я не знаю, но его проявлением в МОЕЙ программе является функция timerHandler.

[quote]
[quote]
action.sa_handler = timerHandler;
[quote]
Что это? Создание нового потока? Нет!!! Это передача указателя на ваш хендлер!!! Он будет вызываться, даже если вы на двух while(1) заблокируетесь...
[quote]
Вы хорошо терминологией владете?
while(1) ничего не блокирует - это просто бесконечный цикл, в котором висит основной поток программы.
И тут верно подмечено, что timerHandler будет вызываться и при зацикленном основном потоке.
Значит? Значит эта функция вызывается в каком-то ДРУГОМ потоке.

[quote]
[quote]
И что значит "ловит"?
Запускается функция, которую я указал как обработчик сигнала?
[quote]
ДА.
[quote]
Уже хорошо. Хоть в чём-то сошлись.

[quote]
[quote]
Она же в отдельном потоке работает по отношению к while (1) в main?
[quote]
:frusty: НЕТ
[quote]
Что ж она в main'е вызывается? В зацикленном while?
Я же в своём коде нигде эту функию не вызываю, а потом он вообще зацикливается (лезть смотреть машинные коды, чтобы проверить - нет ли там "жучков" вызывающих timerHandler?).

[quote]
[quote]
А когда предыдущая не завершила работу и сигнал опять пришёл - опять отдельный поток?
[quote]
НЕЕЕЕЕТ!!!
[quote]
Вот с этим спорить не буду, хотя я и не был бы столь однозначным в ответах.

[quote]
[quote]
Если бы обработка сигналов была однопоточной (типа, работает цикл забирает сигналы, вызывает функции), то тогда всё работало бы как в версии с signal. Но ведь sigaction работает по другому!
[quote]
In the POSIX base standard, a signal handler is an ordinary function that returns void and has one integer parameter. When the operating system delivers the signal, it sets this parameter to the number of the signal that was delivered.
[quote]
Вот умеешь ты привести ссылки на TFM'ы ни к селу ни к городу.
И зачем ты это копипастнул? Что это объясняет в нашем случае?

Попробовал я вставить вместо sleep'а просто цикл for(long i=0;....).
Поведение точно такое же как и со sleep'ом.
Если задержка успела закончиться до прихода следующего сигнала, то код после неё выполняется. Если нет - невыполняется.

Вставил в while, который в main, printf (чтобы может быть увидеть работу двух потоков).
Пока timerHandler успевает кончаться до прихода нового сигнала - все printf'ы всё выводят.
Когда делаешь таймер более частым - printf, который в while(1) - затыкается.
Анализирую.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

[quote]
1. Не нервничайте Вы так, а то напоминаете наших админов, когда к ним с пустяковым вопросом обращаешься.
[quote]

Это не пустяковый вопрос, а непонимание основ...

[quote]
2. Я не говорю, что моя программа создаёт отдельный поток.
[quote]

Хоть что-то радует...

[quote]
Но согласись, что моя функция main, закрученная в while(1) никакие сигналы не обрабатывает.
Т.е. они обрабатываются В ДРУГОМ потоке.
[quote]

"Обработчик сигнала яаляется процедурой режима пользователя, которую система вызывает при получении процессом сигнала." Ну теперь дошло?

[quote]
В каком именно и откуда он берётся - я не знаю, но его проявлением в МОЕЙ программе является функция timerHandler.
[quote]

Все не так загадачно...

[quote]
Вы хорошо терминологией владете?
while(1) ничего не блокирует - это просто бесконечный цикл, в котором висит основной поток программы.
[quote]

Ну суть то вы поняли?

[quote]
И тут верно подмечено, что timerHandler будет вызываться и при зацикленном основном потоке.
Значит? Значит эта функция вызывается в каком-то ДРУГОМ потоке.
[quote]

:frusty:

[quote]
Что ж она в main'е вызывается? В зацикленном while?
Я же в своём коде нигде эту функию не вызываю, а потом он вообще зацикливается (лезть смотреть машинные коды, чтобы проверить - нет ли там "жучков" вызывающих timerHandler?).
[quote]

Читай выше...

[quote]
Вот с этим спорить не буду, хотя я и не был бы столь однозначным в ответах.
[quote]

:frusty:

[quote]
Вот умеешь ты привести ссылки на TFM'ы ни к селу ни к городу.
И зачем ты это копипастнул? Что это объясняет в нашем случае?
[quote]

То, что это ОБЫЧНАЯ функция!!! Или с английским проблеммы? Скажи - я переведу...

[quote]
Попробовал я вставить вместо sleep'а просто цикл for(long i=0;....).
Поведение точно такое же как и со sleep'ом.
Если задержка успела закончиться до прихода следующего сигнала, то код после неё выполняется. Если нет - невыполняется.
[quote]

Та ты шо? :D Не может быть! :D ( Плачу )

[quote]
Вставил в while, который в main, printf (чтобы может быть увидеть работу двух потоков).
Пока timerHandler успевает кончаться до прихода нового сигнала - все printf'ы всё выводят.
Когда делаешь таймер более частым - printf, который в while(1) - затыкается.
Анализирую.
[quote]

Ну как тебе еще объяснить... Ну поймал хендлер сигнал, вывел первый printf, вошел в твой цикл, и снова поймал сигнал!!!! И отак он и висит у тебя!!!
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Вопрос про POSIX-сигнал

Сообщение flook »

Вы sigaction не правильно выставляете. Поскольку структура на стеке - то во флагах мусор и сказать наверняка что произойдет нельзя. Плюс ко всему нужно учесть, что в нкоторых случаях сигнал может блокироваться на время его обработки - этим объясняется различие в signal и sigaction. Так что нужно
1. Написать sigaction случай корректно
2. Разобраться (strace) что делает signal и что sigaction
Вот тогда все встанет на свои места :)
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

flook писал(а):
23.02.2006 15:50
Вы sigaction не правильно выставляете. Поскольку структура на стеке - то во флагах мусор и сказать наверняка что произойдет нельзя.


Это еще по-чему?

flook писал(а):
23.02.2006 15:50
Плюс ко всему нужно учесть, что в нкоторых случаях сигнал может блокироваться на время его обработки - этим объясняется различие в signal и sigaction.


Ну он же его явно не блокирует... А "некотрые случаи"... :)

flook писал(а):
23.02.2006 15:50
Так что нужно
1. Написать sigaction случай корректно
2. Разобраться (strace) что делает signal и что sigaction
Вот тогда все встанет на свои места :)


Это понятно, но все-таки. pause() и alarm() - в 2.4 kernel действительно могут прерываться сигналом?
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Вопрос про POSIX-сигнал

Сообщение flook »

d_Sun писал(а):
23.02.2006 16:06
flook писал(а):
23.02.2006 15:50

Вы sigaction не правильно выставляете. Поскольку структура на стеке - то во флагах мусор и сказать наверняка что произойдет нельзя.


Это еще по-чему?

Как почему?! Потому, что неизвестно, что в ядро передается.

flook писал(а):
23.02.2006 15:50

Плюс ко всему нужно учесть, что в нкоторых случаях сигнал может блокироваться на время его обработки - этим объясняется различие в signal и sigaction.


Ну он же его явно не блокирует... А "некотрые случаи"... :)

Я не берусь сказать, что лежит у него в sa_mask поле структуры, передаваемой sigaction (то что заблокировать во время обработчика) - а вдруг там нет SIG_ALRM? Там же мусор! Плюс еще надо поstraceить как зовет signal ядро. Я точно не помню блокирует ли он обрабатываемый сигнал...

flook писал(а):
23.02.2006 15:50

Так что нужно
1. Написать sigaction случай корректно
2. Разобраться (strace) что делает signal и что sigaction
Вот тогда все встанет на свои места :)


Это понятно, но все-таки. pause() и alarm() - в 2.4 kernel действительно могут прерываться сигналом?

Sleep зовет sigsuspend, насколько мне известно. Но если sigaction заблокировал сигнал мусором, то ничего не разбудят.
Давайте будем последовательны и позовем sigaction корректно, а так же определимся с тем что происходит по signal().
Эти вещи они специфичны для glibc-ей и (честно сказать) я никогда и не знал что на самом деле они перевызывают. Вместо этого в "тугих" местах предпочитаю сразу syscall звать.

Описываемый пример достаточно непрост, так как там ставится обработчит сигнала, который (обработчик) сам по себе заказывает доставку себе же того же сигнала. Понять что происходит можно, но нужно точно знать кто что зовет. Поэтому я и наставиаю на strace чтобы узнать какие именно syscall зовутся (а маны не всегда отражают действительность) и на корректном вызове sigaction, чтобы быть полностью в курсе что именно передают ядру.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

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

Код: Выделить всё

void chandler(int signo)
{
    if (jumpok == 0) return;
    siglongjmp(jmpbuf, 1);
}

int main(void)  {
    struct sigaction act;

    act.sa_flags = 0;
    act.sa_handler = chandler;
    if ((sigemptyset(&act.sa_mask) == -1) ||
          (sigaction(SIGINT, &act, NULL) == -1)) {
        perror("Failed to set up SIGINT handler");
        return 1;
    }

    fprintf(stderr, "This is process %ld\n", (long)getpid());
    if (sigsetjmp(jmpbuf, 1))
        fprintf(stderr, "Returned to main loop due to ^c\n");
    jumpok = 1;
    for (;; )
       ;
}
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Вопрос про POSIX-сигнал

Сообщение flook »

Этот корректен, так как все что надо там проинициализированно.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Вопрос про POSIX-сигнал

Сообщение d_Sun »

flook писал(а):
23.02.2006 16:46
Этот корректен, так как все что надо там проинициализированно.


А... понял... Извиняюсь - не внимательно глянул... :(
Моя подпись сильно длинная :)
Спасибо сказали:
Ответить