Периодический вызов функции в C

Я хочу вызвать функцию, которая периодически создает файлы каждые 5 секунд в C. Ниже приведен код функции, которая создает файлы.

void file_create(int time) {
        snprintf(filename, sizeof(filename),"%s_%d", "data", index);
        FILE *fp = fopen (filename, "w");
        index++;
}

имя файла будет data_0, data_1, data_2 и будет повторяться при каждом вызове.

как вызывать вышеуказанную функцию периодически каждые 5 секунд из основной функции, если я помещаю бесконечный цикл, как показано ниже

while(1){
    file_create();
    Sleep(5000);
}

это не позволяет выполнять строки ниже цикла while.

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


person Vimalan E    schedule 02.06.2020    source источник
comment
Вы думали об использовании отдельного потока или он должен быть в том же потоке?   -  person Gerhardh    schedule 02.06.2020
comment
Знаете ли вы о timerfd_create?   -  person Gerhardh    schedule 02.06.2020
comment
@Milag Верхний регистр означает Windows и Microsoft C lib плюс Windows API. Glibc будет недоступен.   -  person Lundin    schedule 02.06.2020
comment
Все говорят о многопоточности, но вы также можете использовать цикл обработки событий. Которые также являются большими темами. Посмотрите либув.   -  person Qix - MONICA WAS MISTREATED    schedule 02.06.2020
comment
Пожалуйста, отметьте публикацию каким-либо тегом Windows.   -  person Milag    schedule 02.06.2020
comment
Похоже, вы находитесь в Windows. Sleep(() – это блокирующий вызов, который объясняет, почему вы не выполняете строки под циклом while. Вы обязательно должны рассмотреть Threads или Таймеры. Вот ссылка для использования таймеров Windows в консольном режиме (где нет событий Windows петля).   -  person paulsm4    schedule 02.06.2020
comment
ТАКЖЕ: у вас есть УТЕЧКА РЕСУРСОВ. Обязательно звоните fclose() при каждом открытии!!!!   -  person paulsm4    schedule 02.06.2020


Ответы (2)


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

person KDD2020    schedule 02.06.2020

Вы делаете это с помощью многопоточности, которая сама по себе является большой темой. Я бы рекомендовал прежде всего изучить, как работают потоки POSIX (pthreads).

В Windows это означает, что поток должен ожидать пользовательского события «закрыть поток» в течение 5000 мс. Если вы получите событие, остановите поток. В противном случае, в случае тайм-аута, выполните периодическую задачу. Windows использует API потоков, отличный от POSIX.

А также разные функции Sleep(ms) (Windows) и sleep(s) (POSIX)...

person Lundin    schedule 02.06.2020
comment
(Кроме того, в необработанном Windows API есть таймер бедняка с событием WM_TIMER, который я бы не рекомендовал использовать.) - person Lundin; 02.06.2020