0

まず第一に、私は C の初心者です。いくつかのレガシー C コードを継承しています。このアプリケーションでは、タイムアウトが正しく機能していません。シグナルとアラームを使用してタイムアウトを作成します。私は両方を読みましたが、まだ問題があります。

signal(SIGALRM, timeouthandler);
alarm(3);
...(connection to a server that may hang)...

alarm(0);

timeouthandler(){
...(connection to a server that may hang)...
} 

コードの別のセクションにタイムアウトを追加する必要があるまで、これは正常に機能します。

signal(SIGALRM, timeouthandler2);
alarm(3);
...(log the time out)...

alarm(0);

timeouthandler2(){
...(log the time out)...
}

2 回目のタイムアウトが機能しないのはなぜですか? 信号とアラームの間の接続は何ですか? これを行うためのよりクリーンな(複雑ではない)方法はありますか。また、これらの両方のタイムアウトを含む別のタイムアウト ハンドラが必要になります。ありがとう!!

編集:わかりました。一度に2つのタイムアウトを設定することはできないようです。私がやろうとしていることを説明しましょう。接続したいサーバーのリストがあります。接続ごとに接続するのに3秒かかり、そうでない場合はタイムアウトする必要があります。次にglobal、サーバーのリストのタイムアウトも必要です。これにより、すべての接続時間の合計時間が 12 秒を超えた場合にタイムアウトになり、次に進みます。これを行う別の方法はありますか?

4

3 に答える 3

0

シグナルとアラームの関係は、アラームが保留中のシグナルであるということです。そのアラームのシグナル (SIGALRM) は、将来配信されます。man alarm詳細については説明しますが、要約すると、alarm(5);SIGALRM が 5 秒で送信されalarm(0);、(未配信の) アラームがキャンセルされます。シグナル処理関数 (signal()呼び出しの 2 番目のパラメーター) は、シグナルが送信されると呼び出されます (これにより、シグナル ハンドラーが戻るまでプログラムのメイン実行が中断されます)。

なぜ機能しないのか...何が起こっていないのですか?詳細を提供していません。

物事を行うためのよりクリーンな方法については...何をしようとしているのか正確には明らかではないため、答えることはできません。なぜ...code...3 秒以上かかるのでしょうか? それが理解できれば、あなたの質問に答えられるかもしれません。

于 2012-09-13T13:16:27.297 に答える
0

秒数がゼロの場合、新しいアラームはスケジュールされません。alarmマニュアルページから:

seconds が 0 の場合、新しい alarm() はスケジュールされません。

だけでなく:

いずれにせよ、以前に設定された alarm() はキャンセルされます。

そのため、もう一度電話をかけるとalarm、以前に設定したアラームがキャンセルされます。

于 2012-09-13T13:16:34.737 に答える
0

alarm(2)SIGALRM指定された秒数でプロセスに配信されるシグナルをスケジュールし、以前のリクエストをキャンセルします。このように複数のタイムアウトを設定することはできません。それは一か無かです。

Linux を使用している場合は、ポーリング可能な機能を検討することをお勧めしますtimerfd

于 2012-09-13T13:16:39.923 に答える