EN JA
KPROC(9)
KPROC(9) FreeBSD Kernel Developer's Manual KPROC(9)

名称

kproc_start, kproc_shutdown, kproc_create, kproc_exit, kproc_resume, kproc_suspend, kproc_suspend_checkカーネルプロセス

書式

#include < sys/kthread.h>

void
kproc_start( const void *udata);

void
kproc_shutdown( void *arg, int howto);

int
kproc_create( void (*func)(void *), void *arg, struct proc **newpp, int flags, int pages, const char *fmt, ...);

void
kproc_exit( int ecode);

int
kproc_resume( struct proc *p);

int
kproc_suspend( struct proc *p, int timo);

void
kproc_suspend_check( struct proc *p);

int
kproc_kthread_add( void (*func)(void *), void *arg, struct proc **procptr, struct thread **tdptr, int flags, int pages, char * procname, const char *fmt, ...);

解説

FreeBSD 8.0, では、 kthread*( 9) 関数ファミリは、誤った名前付けで実際に生成されたカーネルプロセスであったので、 kproc*( 9) 関数ファミリとなるように名前を変えられました。 異なった 新しい kthread_*( 9) 関数ファミリは、 実際の カーネル スレッド を生成するために追加されました。これらの呼び出しに関する詳しい情報については、 kthread(9) マニュアルページを参照してください。また、 kproc_kthread_add( 9) 関数は、機能性が分割されて、両方のページに現れることに注意してください。

関数 kproc_start() は、 bufdaemon, pagedaemon, vmdaemonsyncer のような“internal” (内部) のデーモンを開始するために使用され、 SYSINIT(9) から呼び出されることを意図されています。 udata 引数は、作成されるべきカーネルプロセスを記述している struct kproc_desc への実際にポインタです:

struct kproc_desc { 
 char  *arg0; 
 void  (*func)(void); 
 struct proc **global_procpp; 
};

構造体のメンバは、次のような kproc_start() によって使用されます:

arg0
プロセスの名前に使用される文字列。この文字列は、新しいプロセスの struct procp_comm メンバにコピーされます。
func
実行されるこのカーネルプロセスのメイン関数。
global_procpp
新たに作成されたプロセスのプロセス構造体を指すために更新されるべき struct proc ポインタへのポインタ。この変数が NULL であるなら、それは、無視されます。

kproc_create() 関数は、カーネルプロセスを作成するために使用されます。新しいプロセスは、プロセス 0、 swapper プロセスとアドレス空間を共有し、カーネルモードだけで実行します。 func 引数は、プロセスが実行するべきである関数を指定します。 arg 引数は、 func が新しいプロセスによって呼び出されるとき、唯一の引数として func に渡される任意のポインタです。 newpp ポインタは、新たに作成されたプロセスを指すために更新される struct proc ポインタを指します。この引数が NULL であるなら、それは、無視されます。 flags 引数は、 rfork(2) で説明されるようにフラグのセットを指定します。 pages 引数は、ページ内の新しいカーネルプロセスのスタックのサイズを指定します。 0 が使用されているなら、デフォルトのカーネルスタックサイズが割り付けられます。引数の残りは、新しいプロセスの名前を構築するために使用され、新しいプロセスの struct procp_comm メンバに格納される printf(9) 引数リストの書式です。

kproc_exit() 関数は、カーネルプロセスを終了するために使用されます。それは、メイン関数が呼び出し側に戻るより、カーネルプロセスのメイン関数によって呼び出されるべきです。 ecode 引数は、プロセスの終了ステータスを指定します。終了している間に、関数 exit1(9) は、プロセスハンドルで wakeup(9) への呼び出しを開始します。

kproc_resume(), kproc_suspend(), と kproc_suspend_check() 関数は、カーネルプロセスをサスペンドして再開するために使用されます。その実行のメインループの間に、それ自体をサスペンドすることができるカーネルプロセスは、唯一の引数として curproc に渡される kproc_suspend_check() を呼び出すべきです。この関数は、カーネルプロセスがサスペンドするか問い合わされているかどうかチェックします。そうしていたなら、それが再開するように伝えるまで、 tsleep(9) されます。いったん、再開するように伝えられているなら、カーネルプロセスの実行が続くことを許可されて返ります。他の 2 つの関数は、カーネルプロセスがサスペンドされるか、または要求を再開することを通知するために使用されます。 p 引数は、サスペンドするか、または再開するカーネルプロセスの struct proc を指します。 kproc_suspend() に関して、 timo 引数は、サスペンド要求とそれ自体のサスペンドを承認するカーネルプロセスをウェートするタイムアウトを指定します。

kproc_shutdown() 関数は、システムシャットダウン活動を妨げるといけないので、システムシャットダウンの間、自発的にサスペンドする必要があるカーネルプロセスのシャットダウンイベントとして登録されることになっています。カーネルプロセスの実際のサスペンドは、 kproc_suspend() で行われます。

kproc_kthread_add() 関数は、kproc が既に存在しているなら、新しいスレッドだけが ( kthread(9) 参照) 既存のプロセスで作成されることを除いて、上記の kproc_create() 関数によく似ています。 func 引数は、プロセスが実行するべきである関数を指定します。 arg 引数は、 func が新しいプロセスによって呼び出されるとき、唯一の引数として func に渡される任意のポインタです。 procptr ポインタは、新しいプロセスが作成されるか、または NULL でないなら、既に存在しているプロセスのためのプロセスポインタを含まなければならない、新しい proc ポインタで更新される位置である struct proc ポインタを指します。この引数が NULL を指すなら、新しいプロセスが、作成され、フィールドは更新されます。 NULL でないなら、 tdptr ポインタは、新しいスレッドポインタで更新される位置である struct thread ポインタを指します。 flags 引数は、 rfork(2) で説明されるようにフラグのセットを指定します。 pages 引数は、ページ内の新しいカーネルプロセスのスタックのサイズを指定します。 0 が使用されているなら、デフォルトのカーネルスタックサイズが割り付けられます。 procname 引数は、作成される必要があるなら、新しいプロセスが与えられるべきである名前です。それは printf スタイル形式の記述子では ありません が、単純な文字列です。引数の残りは、新しいスレッドの名前を構築するために使用され、新しいスレッドの struct threadtd_name メンバに格納される printf(9) 引数リストの書式です。

戻り値

kproc_create(), kproc_resume(), and kproc_suspend() 関数は、成功すれば 0 を、失敗すれば 0 以外を返します。

使用例

次例は、 struct kproc_desc の使用と bufdaemon プロセスを実行する、関数 kproc_start(), kproc_shutdown() と kproc_suspend_check() を例示しています。

static struct proc *bufdaemonproc; 
 
static struct kproc_desc buf_kp = { 
 "bufdaemon", 
 buf_daemon, 
 &bufdaemonproc 
}; 
SYSINIT(bufdaemon, SI_SUB_KTHREAD_BUF, SI_ORDER_FIRST, kproc_start, 
    &buf_kp) 
 
static void 
buf_daemon() 
{ 
 ... 
 /* 
  * このプロセスは、シャットダウン sync の前にサスペンドされる 
  * 必要があります. 
  */ 
 EVENTHANDLER_REGISTER(shutdown_pre_sync, kproc_shutdown, 
     bufdaemonproc, SHUTDOWN_PRI_LAST); 
 ... 
 for (;;) { 
  kproc_suspend_check(bufdaemonproc); 
  ... 
 } 
}

エラー

kproc_resume() と kproc_suspend() 関数は、次の場合に失敗します:
[ EINVAL]
p 引数が、カーネルプロセスを参照していません。

kproc_create() 関数は、次の場合にう失敗します:

[ EAGAIN]
実行中のプロセスの合計数でシステムの制限を超えました。その制限は、 sysctl(3) MIB 変数 KERN_MAXPROC によって与えらます。
[ EINVAL]
RFCFDG フラグが、 flags パラメータで指定されました。

歴史

kproc_start() 関数は FreeBSD 2.2 ではじめて登場しました。 kproc_shutdown(), kproc_create(), kproc_exit(), kproc_resume(), kproc_suspend() と kproc_suspend_check() 関数は、 FreeBSD 4.0 で導入されました。 FreeBSD 5.0 の前に、 kproc_shutdown(), kproc_resume(), kproc_suspend(), と kproc_suspend_check() 関数は、それぞれ shutdown_kproc(), resume_kproc(), shutdown_kproc() と kproc_suspend_loop() と名前が付けられていました。元々、それらは、 kthread_*() と名前が付けられていましたが、実際の kthread が利用可能になったとき、 kproc_*() に変更されました。
October 19, 2007 FreeBSD