海外@筑波大情報学類と申します。
デバイスドライバの中でソケットを生成してそれで他のホストと通信するという
プログラムを作成しているのですが、少し問題がありまして、お知恵を拝借でき
ればと思います。
今、私が作成しているデバイスドライバでは、
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/ ) |
(_____) ─────────────────┘
Follow-Ups:
- [fol] Re: カーネル内でソケットを使うとき....Shinji KONO
- [fol] Re: カーネル内でソケットを使うとき....Kouhei KAIGAI
- Prev by Date: [fol] TCP ポートの解放方法
- Next by Date: [fol] Re: カーネル内でソケットを使うとき....
- Previous by thread: [fol] Re: TCPポートの解放方法
- Next by thread: [fol] Re: カーネル内でソケットを使うとき....
- Indexes:[Main][Thread]