0

Linuxカーネルモジュールでは、リスニングソケットのacceptハンドラーを呼び出して、カーネルスレッドに座って待機しないようにします。O_NONBLOCKしたがって、acceptハンドラーに渡す必要があります。しかし、非ブロッキングソケットではなく、接続されたソケットでタイムアウトを使用したいと思います。

カーネルのソケットを非ブロッキングに構成するための2つのメカニズムを知っています。O_NONBLOCKをsock->opstruct socket * sock)のacceptまたはconnectハンドラーに渡します。その後、O_NONBLOCKフラグをリセットする方法がわかりません。それ以外の場合、ソケットのO_NONBLOCKフラグをどのように変更しますか?

受け入れ時のタイムアウトなど、別の方法はありますか?これにより、リスニングポートに接続されているソケットがブロックされる可能性があります。

4

1 に答える 1

0

残念ながら、「ソケット」という用語は、いくつかの異なるものを指すために使用されています。ユーザー空間の 1 つ (小さな整数値を持つ開いているファイルの説明を介して参照される) には、 で設定できる状態がありますfcntl。カーネル空間のもの (実際の接続エンドポイントへのポインター) はそうではありません。accept または connect ハンドラに渡すO_NONBLOCKと、その特定の accept または connect 操作がノンブロッキングになるだけです。

于 2012-07-11T15:05:41.683 に答える