Показывать что-то каждые 3 секунды - PullRequest
3 голосов
/ 04 января 2010

Я не могу понять, как отображать что-то (например, hello world) каждые 3 секунды. Я пишу только на C-программировании с gcc-компилятором в Linux. Мы можем остановить это, нажав Ctrl + c. Мне просто нужен самый простой и легкий способ манипулировать этим кодом в моем проекте.

Заранее большое спасибо!

Ответы [ 6 ]

9 голосов
/ 04 января 2010
while(1) {
    printf("something\n");
    sleep(3);
}
6 голосов
/ 04 января 2010

Вы можете столкнуться с проблемой в том, что стандартный вывод обычно буферизуется, что означает, что реализация объединяет выходные данные до тех пор, пока их не будет удобно записать. Если вы пишете каждые три секунды (и sleep(3) - хороший способ сделать это), и он не появляется каждые три секунды, попробуйте ввести fflush(stdout); или выполнить запись в стандартный вывод ошибок с помощью `fprintf (stderr) , "что-то \ n");.

4 голосов
/ 04 января 2010
sleep(3);

Функция sleep заставляет вашу программу ждать X секунд, прежде чем вернуться.Обратите внимание, что это между выполнениями, поэтому она не будет запускать вашу команду точно каждые 3 секунды, но достаточно близко для большинства целей.Кроме того, некоторые платформы имеют usleep, где u обозначает микро, что может дать вам большее разрешение.Для получения дополнительной информации см. Справочные страницы.

1 голос
/ 05 января 2010

Только отдаленно связанный, но метод, который я использую все время, это написать программу для отображения чего-то один раз , а затем повторять это каждые n секунды, используя /usr/bin/watch . Я получаю гораздо больше повторного использования таким образом.

1 голос
/ 04 января 2010

Общий подход - написать бесконечный цикл (while (1) { ... }) и приостанавливать выполнение вашей программы каждый тик.

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

#include <stdio.h>
#include <time.h>

int main()
{
  struct timespec t = { 3/*seconds*/, 0/*nanoseconds*/};
  while (1){
    printf("Wait three seconds and...\n");
    nanosleep(&t,NULL);
    fflush(stdout); //see below
  }
}

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

0 голосов
/ 05 января 2010

Тип буфера потока можно контролировать с помощью функции setvbuf () . По умолчанию потоки, ссылающиеся на файлы, являются блочными буферизированными, а терминалы - линейными (stdout) или небуферизованными (stderr).

#include <stdio.h>

int main(int argc, char* argv[]) {
    setvbuf(stdout, NULL, _IONBF, 0);
    while ( 1 ) {
        printf("Wait 3 seconds... ");
        sleep(3);
    }
}

Обратите внимание, что в printf нет \ n . Если вы закомментируете вызов setvbuf () , вы можете увидеть, как все выходные данные приходят сразу после заполнения буфера (обычно 1024 байта).

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