Функция c , которая периодически вызывается

#c #function

#c #функция

Вопрос:

В моей программе на c я хочу создать функцию, которая вызывается периодически, например, раз в секунду. Как я могу это сделать?

Я создаю оболочку в OSX. То же самое должно работать и в Linux. Цель этой функции — отслеживать созданные программы и завершать их работу, когда они начинают использовать слишком много памяти или процессорного времени.

Комментарии:

1. Можете ли вы предоставить больше контекста в своем вопросе? Например, это программа командной строки или это программа с графическим интерфейсом? Требуется ли программе реагировать на пользовательские события (например, события клавиатуры)? На какую операционную систему вы ориентируетесь? Зачем вам нужно периодически вызывать функцию? Для какой задачи она предназначена?

2. Проблема не в функции. Каждая функция может вызываться периодически. Вам нужно что-то вроде потока, который вызывает функцию через заданный интервал.

3. Это, безусловно, помогло бы узнать, на какой платформе вы это делаете. Например, в Unix-подобной системе вы могли бы поместить свою функцию в обработчик для SIGALRM и запросить сигналы тревоги. Я уверен, что подобные опции существуют в Windows.

4. Как насчет настройки задания cron?

Ответ №1:

Хорошо — вот решение для pthread. Возможно, кто-то захочет проверить правильность использования моего pthread API, но я убедился, что это работает:

 #include <stdio.h>
#include <pthread.h>

#define false (0!=0)
static void * TimerRoutine(void *) ;

int main( int argc, const char ** argv)
{
    pthread_t thread ;
    pthread_attr_t attr ;

    pthread_attr_init( amp; attr ) ;
    pthread_create( amp; thread, amp; attr, TimerRoutine, NULL ) ;

    int done = false ;
    while( !done )
    {
        char input[80] ;
        scanf("ys", input) ;
        // handle input command (or something)

        done = ( 0 == strcmp( input, "quit" ) ) ;
    }

    // wait for timer thread to exit
    pthread_cancel( thread ) ;
    pthread_join( thread, NULL ) ;
}

static void * TimerRoutine(void * arg)
{
    pthread_detach( pthread_self() ) ;

    int done = false ;
    while( !done )
    {
        // do background task, i.e.:
        printf("tick!n") ;
        sleep(1) ;

        pthread_testcancel( ) ;
    }   
}
  

Комментарии:

1. Обратите внимание, что если вы хотите точную синхронизацию в 1 Гц, режим ожидания (1) необходимо будет изменить на usleep (1000000-дельта), где delta — это время, прошедшее с момента окончания предыдущего режима ожидания.

Ответ №2:

Если вы используете Boost, вы можете использовать функцию таймера Boost для регистрации обратных вызовов, которые периодически вызываются.
Взгляните сюда:

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

РЕДАКТИРОВАТЬ: Поскольку вы используете Mac OS X, возможно, вы можете использовать это
Хотя я ею не пользовался, просто быстрый поиск в Google показывает, что amp; dont this это будет работать для Linux, потому что это должно быть специфично для платформы.

Ответ №3:

Вы можете использовать потоки posix ( <pthread.h> ) и sleep / clock_nanosleep ( <time.h> ). POSIX API поддерживается всеми unix, включая Linux и Mac OS X.

Ответ №4:

Вы могли бы просто создать высокоприоритетный поток, который выполняет циклы, но тратит секунду в режиме ожидания между каждым циклом.

Ответ №5:

Если вам не нужно несколько потоков, как насчет этого:

 #include <stdio.h>

#define false (0!=0)

int main( int argc, const char ** argv)
{
    int done = false ;
    while( !done )
    {
        // check for rogue processes here

        sleep(1) ;
        printf("tick!n") ;
    }
}
  

Комментарии:

1. Если это используется, то как программа может делать что-либо еще?

2. это невозможно — не знал, что вы этого хотите 🙂

Ответ №6: