C / UNIX Выполнять функцию один раз каждые x миллисекунд - PullRequest
2 голосов
/ 16 мая 2011

Как выполнить функцию один раз каждые 1000 миллисекунд, используя alarm () или sleep?Я хочу, чтобы программа делала что-то еще, если функция не выполняется или не завершается за 1000 миллисекунд.

РЕДАКТИРОВАТЬ: добавлен псевдокод

while(true) {
alarm(1000);
execute function;
sleep(1000);
alarm(0);
}

Теперь, если сигналы тревоги (1000) SIGALRM, это гдеЯ мог бы вызвать другую функцию?Я новичок в такого рода вещах, поэтому даже не уверен, правильно ли я это использую.

Ответы [ 3 ]

7 голосов
/ 16 мая 2011

Насколько четким является требование, т. Е. Сколько джиттера вы можете терпеть?

Какая версия UNIX?

Как правило, если это жесткий крайний срок - он звучит как один -- вам нужно будет сделать что-то особенное, потому что базовый UNIX на самом деле не представляет собой систему реального времени.

Предположим на данный момент, что вы имеете в виду Linux.Вам нужно

  • использовать nice (2) для повышения приоритета процесса
  • использовать детализированный таймер, какс ualarm (3)

Это, вероятно, do .Если вам нужно более детальное или более предсказуемое время, то вам, вероятно, нужно написать расширение ядра, которое может управляться таймером ядра.(Solaris имеет некоторую улучшенную поддержку для работы в режиме реального времени, но это все же не очень сложная система реального времени.)

Жизнь станет значительно проще, если вы сможете использовать Linux или UNIX в реальном времени.Вот список некоторых опций .Вот статья , которую вы можете найти usefui.

Обновление

Вы также должны взглянуть на nanosleep (2) или сетитимер (2) .Обратите внимание, что все они говорят, что интервал составляет , по крайней мере, один в аргументе.Если у вас жесткие сроки, вам нужно подождать немного меньше, чем фактический интервал, а затем выяснить, что делать с любым изменением вашей тысячи миллисекунд.

2 голосов
/ 16 мая 2011

Я использовал эту функцию в Linux для «сна» в миллисекундах:

void Sleep(unsigned int milliSeconds)
{
    struct timespec req = {0};

    time_t seconds  = (int) (milliSeconds / 1000);
    milliSeconds    = milliSeconds - (seconds * 1000);
    req.tv_sec      = seconds;
    req.tv_nsec     = milliSeconds * 1000000L;

    while (nanosleep(&req, &req) == -1)
        continue;
}
1 голос
/ 16 мая 2011
while (1) {
    sleep(1);
    /* Act */
}

Если вам нужны более длительные задержки, обычный способ сделать это - вызвать select () без fds и небольшого тайм-аута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...