4

または何秒かが開始されて実行されたらalarm(5)、プログラムでしばらくしてから、何らかのアクションが発生した場合は、アラームを再びにリセットする必要がありalarm(5)ます。どうすればこれを達成できますか?

利用可能なアラームreset()はありますか?

int flag=0;
void alarmhand(int signal)
{ 
  flag=1;
  // printf("\n time out");
}

void main()
{
  signal(SIGALRM,alarmhand);
  alarm (5);
  while(1)
  {
   event_status();
   if(flag==1)
       break;
  } 
}

void event_status()
{
  int reset;
  printf("reset 1=y/2=n :");
  scanf("%d",&reset);
  if(reset==1)
  {
   // alarm.reset(5);
  // HOW DO I RESET THE ALARM AGAIN TO 5 HERE ??
  }
}
4

3 に答える 3

9

新しいアラームを設定するだけで、古いアラームはキャンセルされます。

alarm (5);

Linuxのalarmマニュアルページから、少し言い換えます):

alarm()指定SIGALRMされた秒数でシグナルが呼び出しプロセスに配信されるように調整します。

指定された秒数がゼロの場合、新しいアラームはスケジュールされません。

いずれにしても、以前に設定されたアラームはキャンセルされます。

前述のように、現在のalarm()アラームは、他の何よりも先にを呼び出すことによってキャンセルされます。alarm()toの引数がゼロの場合、新しい引数は作成されません。

したがってalarm(0)、現在アクティブなアラームをキャンセルalarm(5)し、新しいアラームを作成するか、現在アクティブなアラームを5秒にリセットします。

于 2013-03-20T02:47:24.433 に答える
4

未処理をキャンセルするにはalarm()、を使用しますalarm(0)。その戻り値は、への最後の呼び出しからどれだけの時間が使用されなかったかを示しますalarm()。もちろん、新しいアラームを自由に設定できます。

于 2013-03-20T02:47:42.477 に答える
-1

システムコールを使用sigaction()し、始動時にのみアラーム信号を処理します。ISR機能を使用して、必要なときにすべてのアクションのアラームをリセットします。

于 2013-03-20T04:10:50.757 に答える