私はこの回答を投稿して、「明白な」アプローチとはまったく異なるアプローチを説明しました。誰かがそれがまさに必要なものであることに気付くことを期待しています。ベストアンサーに選ばれるとは思っていませんでした!潜在的な危険性と同時実行性の問題があるため、このソリューションは注意して扱ってください...
setitimer()システムコールを使用して、指定されたミリ秒数後にSIGALRM(アラーム信号)をプログラムに送信できます。シグナルは、実行中のプログラムを中断してシグナルハンドラーを実行させる非同期イベント(メッセージに少し似ています)です。
プログラムの開始時にOSによって一連のデフォルトのシグナルハンドラーがインストールされますが、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++)
;
}