[quote]
[quote]
А как он реализован? Не тот же, который в while (1) висит? Значит отдельный.
[quote]
Какой нах
отдельный?
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]
НЕТ
[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) - затыкается.
Анализирую.