Асинхронный, синхронизированный вызов функции в C на Linux? - PullRequest
5 голосов
/ 14 сентября 2010

Какой самый простой и эффективный способ в C в Linux - асинхронно вызывать функцию после определенной задержки (например, setTimeout в JavaScript) или периодически повторять вызов таймера (аналогично setInterval)?

Хотя этот вопрос относится к Linux, я надеюсь, что есть метод, который является кроссплатформенным.

Ответы [ 2 ]

9 голосов
/ 14 сентября 2010

Самое простое решение для Linux - использовать функцию alarm:

void alarm_handler (int signum)
{
    printf ("Five seconds passed!\n");
}

signal (SIGALRM, alarm_handler);
alarm (5);
Функции

getitimer и setitimer могут использоваться для создания таймеров с более высокой точностью. ( подробнее ... ).

7 голосов
/ 14 сентября 2010

Есть два способа сделать это:

Во-первых, как уже упоминалось в другом ответе, это сигналы, запускаемые с помощью alarm() или setitimer(). Обе функции доступны в любой ОС, которая придерживается POSIX; есть третья функция с именем ualarm(), которая устарела в 2008 году. Недостатком является то, что небезопасно делать что-либо существенное (например, ввод / вывод или другие системные вызовы) в обработчике сигналов, поэтому на самом деле все, что вы хотите сделать, это, возможно, установите флаг и позвольте другому что-нибудь поднять.

Во-вторых, использовать поток, который спит в течение определенного интервала, а затем вызывает вашу функцию. POSIX стандартизировал потоки как расширение в начале 1990-х годов, и большинство современных ОС, поддерживающих потоки, поддерживают потоки POSIX. Подводный камень в том, что вы должны понимать последствия наличия двух контекстов выполнения в одном и том же пространстве данных и разрабатывать свою программу соответствующим образом, иначе вы столкнетесь с проблемами, которые могут стать кошмаром для отладки.

Имейте в виду, что тревоги и сны обещают делать то, что они делают только после по крайней мере указанного времени, поэтому вам не гарантируется, какую точность вы получите на реальном операционная система.

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