最終更新:2010-09-02 (木) 02:46:16 (3389d)  

fork はてなブックマークを見る
Top / fork

プロセスのコピーを生成

pid_t pid;

pid = fork();

if (pid == 0) {
	/* 子プロセス:
	* fork()が0を返す場合、子プロセスである
	* 1秒に1ずつ、10まで数える。
	*/
	int j;
	for (j=0; j < 10; j++) {
		printf("child: %d\n", j);
		sleep(1);
	}
	exit(0); /* exit() を使わない点に注意 */
} else if(pid > 0) { 
	/* 親プロセス:
	* 0以外の場合、親プロセスである
	* ここでも10まで数える
	*/
	int i;
	for (i=0; i < 10; i++) {
		printf("parent: %d\n", i);
		sleep(1);
	}
} else {   
	/* エラー処理 */
	fprintf(stderr, "couldn't fork");
	exit(1);
}

メモ

  • forkはそれを実行したプロセスの子プロセスを作成する.子プロセスは親プロセスのコピーである.
  • プロセスをどこまで実行したか(プログラムカウンタ?)もコピーされるので,子プロセスはforkの返り値が返るところから実行される(と,思う).
  • あと,ファイルディスクリプタなどもオープンされていればそのままコピーされる.コピーされないのはpidやppidとファイルロックやサスペンド中のシグナルぐらいだろうか.
  • そして,そのforkの返り値によって,プロセスは自分が親プロセスか子プロセスかを知ることができる.
  • forkが呼び出されると、子プロセスのためのアドレス空間が新たに作成される。子プロセスのアドレス空間には親プロセスが持っていた全セグメントのコピーがあるが、コピーオンライト機能によって実際の物理メモリの確保は遅延される。親プロセスと子プロセスは独立して実行される。

参考