*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]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS