2015-10-05 3 views
1

Я изучаю C на данный момент, но я не вижу никаких существующих примеров того, как я мог запускать команду каждые X минут.Запуск команды каждые X минут в C

Я могу видеть примеры, касающиеся времени команды, но это не то, что я хочу.

Как я могу запускать команду каждые X минут в C?

+0

На какой платформе вы работаете? –

+1

Что такое os? Cron или sceduler - хорошая ставка –

+0

Я имею в виду, как запускать команду каждые X минут внутри программы C. Я не хочу планировать выполнение программы на C. – Jack

ответ

4

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

Вы можете сделать это на POSIX системах.

Предполагая, что вы фокусируете систему Linux, внимательно прочитайте time(7). Тогда читайте о sleep(3), nanosleep(2), clock_gettime(2), getrusage(2) и некоторые другие syscalls(2) ... и т.д. ...

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

Прочитайте некоторую книгу о Advanced Linux Programming или Posix Программирование.

BTW, Linux имеет crontab(5) и все связанные с ним утилиты: free software, поэтому вы можете изучить их исходный код.

+1

C11 добавил ['thrd_sleep'] (http://en.cppreference.com/w/c/thread/thrd_sleep). К сожалению, [он пока еще не поддерживается] (https://stackoverflow.com/questions/22875545/c11-gcc-threads-h-not-found/22875599#22875599). – 5gon12eder

1

Вы можете запросить свой вызывающий поток до sleep в течение определенных секунд.

#include <unistd.h> 

unsigned int sleep(unsigned int seconds); 

Это соответствует POSIX.1-2001.

sleep - это нестандартная функция. Как уже упоминалось here:

  • В UNIX, вы должны включать <unistd.h>.
  • В MS-Windows, Sleep скорее от <windows.h>
+1

Эти две функции разные. У них разные имена, разные аргументы и разные коды возврата. – alk

+0

Yep функции разные и помещаются в отдельные файлы заголовков. Один возвращает int other a void –

0

Чтобы сделать это, и позволить другим вещам происходить между вызовами, предлагает использовать нить.
непроверенный псевдокод, но если вы используете Linux, он может выглядеть примерно так: (запустите поток и заставьте его в течение 60 секунд в цикле рабочих функций между вызовами на вызов периодической функции)

void *OneMinuteCall(void *param); 
pthread_t thread0; 

int gRunning == 1; 

OneMinuteCall(void * param) 
{ 
    int delay = (int)param; 
    while(gRunning) 
    { 
     some_func();//periodic function 
     sleep(delay);//sleep for 1 minute 
    } 
} 

void some_func(void) 
{ 
    //some stuff 
} 

int main(void) 
{ 
    int delay = 60; //(s) 
    pthread_create(&thread0, NULL, OneMinuteCall, delay); 
    //do some other stuff 
    //at some point you must set gRunning == 0 to exit loop; 
    //then terminate the thread 

    return 0; 
} 
+0

Спасибо, исправлено. Im редактируя это от среды Linux :) – ryyker

0

Как было предложено пользователем 3386109, с использованием какой-либо формы часов для задержки и сна для уменьшения затрат на процессор будет работать. Пример кода для обеспечения базовой концепции. Обратите внимание, что задержка основана на первоначальном чтении времени (последнее обновление обновляется на основе требуемой задержки, а не последнего показания часов). numsec должен быть установлен на 60 * X для запуска каждые X минут.

/* numsec = number of seconds per instance */ 
#define numsec 3 
time_t lasttime, thistime; 
int i; 
    lasttime = time(NULL); 
    for(i = 0; i < 5; i++){  /* any loop here */ 
     while(1){ 
      thistime = time(NULL); 
      if(thistime - lasttime >= numsec) 
       break; 
      if(thistime - lasttime >= 2) 
       sleep(thistime - lasttime - 1); 
     } 
     /* run periodic code here */ 
     /* ... */ 
     lasttime += numsec;  /* update lasttime */ 
    } 
Смежные вопросы