Вопрос

Похоже на это вопрос, Я хотел бы ограничить время выполнения функции-предпочитаемой микросекундной точностью-в C. Я полагаю, что исключения C ++ можно использовать для достижения результата, аналогичного аналогично это Раствор питона. Хотя это не идеально, такой подход совершенно недоступен на простом C.

Интересно, как я могу прервать выполнение функции после определенного временного интервала в C в системе POSIX? Для относительно простых ситуаций немного глупый бизнес работает просто отлично, но это добавляет достаточное количество кода, ортогонально к проблемному решению. Допустим, у меня есть такая функция:

void boil(egg *e) {
    while (true)
    do_boil(e);
}

Я хочу бежать закипать на яйце*, прерывая его каждые 50 мкс, чтобы проверить что -то вроде так:

egg *e = init_egg();
while (true) {
    preempt_in(50, (void) (*boil), 1, e);
    /* Now boil(e) is executed for 50μs, 
       then control flow is returned to the
       statement prior to the call to preempt_in.
     */
    if (e->cooked_val > 100)
        break;
}

Я понимаю, что для этого можно использовать Pthreads, но я больше заинтересован в том, чтобы избежать их использования. я мог Переключайте между UContext_T в обработчике SigAlrm, но стандартный POSIX отмечает, что использование SetContext/Swapcontext не должно использоваться в обработчике сигнала, и, действительно, я отмечаю различное поведение между системами Linux и Solaris, когда это сделано.

Это эффект возможно достигать? Если да, портативным образом?

Это было полезно?

Решение

Просто отметить, что общая возможность, которую вы ищете здесь, называется Затраты на соблюдение затрат. Анкет Например, см. Эта статья Веллингс или в Leung, et. Ал. отличная книга. Анкет Ответы выше сосредоточены на достижении его в пользовательском пространстве; Некоторые RTO или языки поддерживают его (не Linux) как общий механизм.

Один пример ОС, которая предоставляет это Autosar OS (спецификация связана). Анкет Обратите внимание, что эта ОС предоставляет Время исполнения, что немного отличается от Крайний срок правоприменения. Применение времени выполнения продолжает становиться все труднее, поскольку оно опирается на некоторую способность измерить фактическую затраченную затрату (обычно при аппаратном сотрудничестве). С сложностью сегодняшних процессоров трудно и дорого измерить это - не говоря уже о том, что значение измерений (из -за нелинейного исполнения и всех видов других крутых вещей) трудно интерпретировать - и, следовательно, трудно вычислять (для вычисления ( Худшая или общая) оценка случая конкретного раздела времени выполнения кода.

Немного не по теме, но ADA предоставляет более строгий набор возможностей на языковом уровне, что не помогает вам, но вы можете выяснить, как эти требования ADA были реализованы в Linux. Спецификация языка ADA уникальна в предоставлении обоснования документа, см. Раздел о превентивное прерывание в реальном времени как точка отправления.

Другие советы

Вы можете использовать потоки или провести функциональный опрос таймер (или глобальную переменную, установленную SIGALRM Хэндлер), затем сохраните его состояние и выйдет, когда истек срок отведенного времени. Использование ucontext_t устарел и никогда не должен использоваться в новом коде, вообще, а тем более от обработчиков сигнала.

Решение, которое я желаю, внезапно приходит мне: goto! Я настрою точку прыжка сразу после функции, которую я хочу ограничить, установите таймер и в обработчике сигнала, который имеет дело с Sig*Alrm просто прыгнуть к инструкции после функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top