*fork [#qe0c3626] #contents -[[研究関係Wiki・SSS-PCへ戻る>Lab/SSS-PC]] **forktest.c [#k128f975] **proc_fork [#u6b772dd] OBJECT_NAME proc_fork(); /* OBJECT_NAME proc_fork(start,stack_size,org_name) BYTE *start; 開始アドレス(関数エントリ) BYTE4 stack; スタックサイズ(byte単位) OBJECT_NAME org_name; 生成されるタスク名(NILなら自動作成) 返り値 生成したタスクの名前を返す。 失敗したときは-1を返す このシステムコールはUNIXのforkではなく、 forkした親とSTACK以外を共有したメモリ空間を 持つ子タスクを生成します。proc_forkは実体を 生成するだけで、起動するにはproc_start(タスク名) で明示的に親(または他の誰か)が起動する 必要があります。子タスクは別のアドレス空間を 持っていますので、fork後にmapされたメモリは 親と子の間で共有されません。 標準入出力とMBCFのコネクション情報は親の 情報を引き継ぎます。子どもだけを殺すことは 可能ですが、親を殺すと子どもも死にます。 子どもはcrt0.cを経由せずに関数を呼び出すので、 エントリ関数からのreturnは動作が保証されません。 self_endまたはself_end_code_deleteで終了して下さい。 startアドレスをNULLとすることで、スタックの 内容をコピーして、プログラムポインタを含むすべての レジスタの内容を継承した子タスクを生成します。 この場合も、子タスクの起動はproc_startによって 明示的に行って下さい。 */ **unix_fork [#z9cee793] OBJECT_NAME unix_fork(); /* OBJECT_NAME unix_fork(void) 返り値 生成した子タスクの名前を返す。 失敗したときは-1を返す このシステムコールはUNIXのforkとの互換性のために 作られました。 親のメモリ空間の内容をコピーしたメモリ空間を 持つ子タスクを生成します。unix_forkは実体を 生成し、親に返り値を返すretQを生成し、 子タスクを起動します。 子タスクは完全に独立した別のアドレス空間を 持っていますので、CSMやDSMを除いたメモリは 親と子の間で共有されません。CSMやDSMは親子の 間で共有され、親子間の共有メモリとして使用できます。 標準入出力とMBCFのコネクション情報は親の 情報を引き継ぎます。子どもだけを殺すことは 可能ですが、親を殺すと子どもも死にます。 子タスクはcrt0.cを経由せずにunix_fork()の続きから 実行が継続されます。子タスクの終了時の返り値は タスクのretQを経由して親タスクに返されます。 返り値をキューに書き込んだ子タスクはタスク構造体を 含めて存在が消去されます。unixとは異なり ゾンビとしてメモリ上に残ることはありません。 タスク終了時の返り値はproc_retQ_read()関数で親タスクが 読み出すことができます。返り値を読み出されたキューは 消去されます。 */ [[Lab/SSS-PC]]