0

特定の時間にイベントをスケジュールしたいのですが、より正確には、ポアソン トラフィックを生成したいと考えています。したがって、指数分布から生成される特定の時間間隔でパケットを送信する必要があります。インターネットでいくつかの調査を行ったところ、このsetitimer方法で特定の時間後にアラーム信号をスケジュールできることがわかりましたが、私の場合の使用方法がわかりません。

アドバイスをありがとう。私はあなたの言うことに従いました。まだ少しクエリがあります。私のコードでは、2 つの独立したイベントを同時にスケジュールする必要があります。通常は、2 つのキューを同時に満たす必要があります。これは私が今やったことです:

void Queue_class::SetPoissonTraficFirstQueue(void)

{  // add one packet to the queue 
   struct sigaction act ; 
   struct itimerval timer ; 
   act.sa_handler = this ; 
   sigempty_set(&act.sa_mask) ; // no signal is added to the sa_mask 
   act.sa_flags = 0 ; 
   sigaction(SIGALARM, &act,0) ; 
   timer.it_value.tv_usec = 0 ; 
   timer.it_value.tv_sec = exponential_variable() ; // generates a random exponential variable
   timer.it_interval.tv_sec = 0 ; 
   timer.it_interval.tv_usec = 0 ; 
   setitimer(ITIMER_REAL, *timer, NULL) ; 

 }

他のキューでも同じ関数ですが、指数確率変数が異なります

主に、次のことを行います。

int main()
{
   Queue_class queue ; 
   queue.SetPoissonTraficFirstQueue() ; 
   queue.SetPoissonTraficSecondQueue() ; 
   // do business
}

2つの質問があります:

1- sa_handler メソッドでポインター「this」を使用して関数を内部的に呼び出すのは良い解決策ですか?

2- メイン関数では、2 つのプロセスが同時に実行されますか? つまり、両方のキューが同時に満たされているということですか?

4

1 に答える 1

0

今日の午後 6 時にタイマーをスケジュールしたいとしましょう。time_t(egstrptimeまたは他の関数を使用して)その時刻を取得し、現在とその時刻difftimeの間の秒数を取得するために使用できます。この値は、タイマー (つまり ) の「値」に使用できますitimerval.it_value.tv_sec。間隔がクリアされている場合、これは 1 回限りのタイマーになります。

一方、X 秒ごとに呼び出される繰り返しタイマーを作成する場合は、値と間隔の両方を X に設定します。

これら両方の花瓶で、 を使用ITIMER_REALし、シグナルハンドラ catch を用意しSIGALRMます。

于 2012-08-03T09:18:01.413 に答える