LINUX.ORG.RU

функция с ограничением по времени исполнения


0

0

использую с. нужно задать ограничение на время выполнения ф-ции. я использую след. Хочется узнать есть ли какая-либо альтернатива методу, и ещё alarm срабатывает только раз в таком коде jmp_buf buf; ... void alrm_handler(int a){ puts("ALARM"); longjmp(buf); }

signal(SIGALRM, alrm_handler); while (1 && !isStop){ struct itimerval alarm; alarm.it_interval.tv_sec = 0; alarm.it_interval.tv_usec = 0; alarm.it_value.tv_sec = a; alarm.it_value.tv_usec = b; setitimer(ITIMER_REAL, &alarm, NULL); if (setjmp(buf)){ puts("время истекло"); }else{ //вызов фун-ции } }

anonymous

>и ещё alarm срабатывает только раз в таком

Если использовать signal() то один раз и будет, если нужно обрабатывать все SIGALARM, используй sigaction().

>нужно задать ограничение на время выполнения ф-ции. я использую след.

Подробнее, как это ограничение на время выполнения функции? Судя по коду когда время заканичивается, будет longjmp неизвестно куда, а функция то не завершится, значение не вернет...

Может быть лучше делать отдельный процесс(потомок) или отдельный поток, и сигналом / семафором указывать ему что время вышло...

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

ещё как вариант - запустить ф-ю в потомке и установить для потомка лимит ресурса CPU.

если произойдёт выход по тайм-ауту то родитель это узнает проанализировав результат wait()

cvv ★★★★★
()

да я неверно выразился в моем случае мне нужно чтобы ф-ция выполнилась за тайм-аут или мы возвращаемся на исходные позиции P.S. спасибо за ответы

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

Нет ничего невозможного.

На входе в функцию сохраняем esp.

В обработчике сигнала восстанавливаем esp,кладем в eax код возврата , делаем ret.

для amd64 соответственно rsp и rax

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

Обработчик ALARM в юзерспэйсе.

При получении сигнала, если функция в контектсе ядра , то возвращается interrupted system call.

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