Я опубликовал этот ответ, чтобы проиллюстрировать совершенно иной подход к «очевидному», в надежде, что кто-то обнаружит, что он именно то, что ему нужно. Я не ожидал, что он будет выбран как лучший ответ! Относитесь к этому решению с осторожностью, потому что есть потенциальные опасности и проблемы параллелизма ...
Вы можете использовать системный вызов setitimer () , чтобы SIGALRM (сигнал тревоги) отправлялся в вашу программу через указанное количество миллисекунд. Сигналы - это асинхронные события (немного похожие на сообщения), которые прерывают выполняющуюся программу, чтобы запустить обработчик сигнала.
Набор стандартных обработчиков сигналов устанавливается ОС при запуске вашей программы, но вы можете установить собственный обработчик сигналов с помощью sigaction () .
Так что все, что вам нужно, это один поток; используйте глобальные переменные, чтобы обработчик сигнала мог получить доступ к необходимой информации и отослать новый пакет или повторить последний пакет в зависимости от ситуации.
Вот пример для вашей выгоды:
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
int ticker = 0;
void timerTick(int dummy)
{
printf("The value of ticker is: %d\n", ticker);
}
int main()
{
int i;
struct sigaction action;
struct itimerval time;
//Here is where we specify the SIGALRM handler
action.sa_handler = &timerTick;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
//Register the handler for SIGALRM
sigaction(SIGALRM, &action, NULL);
time.it_interval.tv_sec = 1; //Timing interval in seconds
time.it_interval.tv_usec = 000000; //and microseconds
time.it_value.tv_sec = 0; //Initial timer value in seconds
time.it_value.tv_usec = 1; //and microseconds
//Set off the timer
setitimer(ITIMER_REAL, &time, NULL);
//Be busy
while(1)
for(ticker = 0; ticker < 1000; ticker++)
for(i = 0; i < 60000000; i++)
;
}