2016-10-31 10 views
1

では動作しません。私はこのコードを実行しようとしている:アラーム(int)がwhileループ

signal(SIGALRM,handler); 
alarm(1); 
while(1){} 

handler機能は、単に「test」を出力します。

alarm(1)この場合、最終的に1回だけ実行されます。私はループに入れようとしましたが、それはまったく実行されないようです!

私はちょっと新鮮なシグナルです。誰かが私にこのことがどういうことを説明することができますか

+1

ループ内で 'alarm'を呼び出すと、それを1秒間連続してリセットし、決して逃げる機会はありません。定期的なタイマーが必要な場合は、 'setitimer'または' timer_create'を調べることができます。 –

+1

次回は、[MVCE](http://stackoverflow.com/help/mcve)の提供を検討してください。少なくとも、あなたが尋ねるコードを表示するのではなく、他のコードを表示し、それがあなたを困惑させるコードとどのように違うのかを説明する...また、あなたが求めている機能についてのドキュメントを読んで、答えを見つけることは良い考えです。 – hyde

答えて

5

例のループにalarm(1)を入れるだけでは、呼び出しごとに数マイクロ秒以内にalarm(1)を無限に呼び出します。 thisが発生します。

alarm()でアラームは既に設定されていますが、配信されていない場合、alarm()の別の呼び出しが以前の呼び出しより優先されます。

つまり、ループの各繰り返しでアラームがクリアされます。ループが永遠に実行されるので、アラームは決して永久に設定されません。

+3

@downvoterなぜdownvote?本当に答えとして知りたいのは私には良いようです。 – kaylum

+0

Aha ok!今分かります。しかし、とにかくアラームを送信する前に待っている点は何ですか?私はなぜアラームを送信する前に少なくとも1秒待たなければならないのでしょうか? – Elirovi

+2

@Elirovi実生活では、目覚めてからすぐに警報を発するというのは何ですか?こっちも一緒。警報の全体のポイントは、後で*あなたを目覚めさせることです。 – kaylum