2017-03-26 10 views
0

私はカーネルスレッドで実行されている次のようしている:私は非常に頻繁にUDPパケットを受信正常にブロックするkernel_recvmsg()を終了するには?

size = kernel_recvmsg(kthread->sock, &msg, &iov, 1, bufsize, MSG_DONTWAIT) 

(10ms毎の者が言ってみましょう)。できるだけ早くそれらを処理するために、私はkernel_recvmsg()があるループの中にスリープを持っていません。残念ながら、私はUDPパケットが到着していない間に非常に大きなCPU消費を観察します。 ソケットをブロックして(MSG_DONTWAITを削除する)、間接的にkernel_recvmsg()をブロック解除して終了する方法がありますか?

予期せぬsock_release()を実行するとどうなりますか? kernel_recvmsg()はブロックを解除してエラーを返し、それに応じて処理することができますか(ループとスレッドを終了しますか)?

答えて

0

UDP待機を別のスレッドからブロック解除するのは簡単です。ローカルスタックでブロック解除するデータグラムをsendto()します(空の場合は問題ありません)。いくつかの 'abort'ブール型フラグを使用してpost-kernel_recvmsgコードに戻り、他の異常なアクションを実行するよう指示することができます。

つまり、成熟したOSには、ソケットが別のスレッドからクローズされている場合にソケット待機をブロックしない通信スタックはほとんどありません。私はこれを信頼できないと聞いたことがありますが、基になるソケットが解放された場合にエラーの戻り値または例外が即座に発生しないケースは一度もありません。

+0

はい、これは良い選択肢です。ありがとう! – valioiv

関連する問題