[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[fol] カーネル内でソケットを使うとき....


海外@筑波大情報学類と申します。

デバイスドライバの中でソケットを生成してそれで他のホストと通信するという
プログラムを作成しているのですが、少し問題がありまして、お知恵を拝借でき
ればと思います。


今、私が作成しているデバイスドライバでは、

Openメソッド
  ・sock_create(PF_INET,SOCK_STREAM,0,&sock);のようにして、
    ソケットを生成する。
  ・kernel_thread()を利用して、ソケットを監視するスレッドを生成する。

Writeメソッド
  ・ソケットを利用して、接続中の他のホストにデータを送信する

Closeメソッド
  ・ソケットを開放する。同時に、ソケットの監視を行っているスレッドも終了する

という形を考えており、OpenとWriteは正常に動作します。
ところが、ソケットを監視しているスレッドの中身は

static int AnotherThread(void *arg){
  int i;
  unsigned long code;
  vwMessageProcInfo *mpi;
  mpi = (vwMessageProcInfo *)arg;
  
  while( vwGetEvent(mpi->sock,&(mpi->ev))==True ){
    down( &(mpi->mutex) );
    OnMessage( &(mpi->ev) );
    up( &(mpi->mutex) );
  }
  printk("Recv loop broken.\n");
  return( 0 );
}

# vwGetEventは、第1引数のソケットから、第2引数のデータ格納用構造体に
# データを読み込むための関数です。
# ライブラリ関数のrecv()に相当

のような形になっており、ユーザー空間での感覚で、ソケットをclose()すると
同時にrecv()もエラーを返してくると考えていたのですが、
やはり、sock_release()で突然ソケットを開放したらポインタ無効でカーネルごと
お亡くなりになられました。

そのあとも色々と思考錯誤をしたのですが、どうしてもうまく行きません。
カーネル内でデータを待ってブロッキングしているスレッドに対して、
何らかの方法でデータ待ち状態から脱出させたいのですが、
皆様のお知恵を拝借できれば幸いです。

それでは。

─────────────────────┐
  (((   ▽   ことなかれ主義にNo!   ▼  │
<ー )   筑波大学情報学類四年  海外 浩平  │
 (   )  ( E-mail: kaigai _at_ kaigai.gr.jp   ) │
  m^m   ( URL: http://www.kaigai.gr.jp/ ) |
(_____) ─────────────────┘


この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: