ふつうのLinuxプログラミング 第11章-第12章1 forkがわからねぇ〜。

あぁ、昨日のforkがイマイチ掴めていない。

なので、実験を重ねる。

printf("hoge\n");
pid = fork();

hogeは1度しか表示されない。つまり、

 |    printf("hoge\n");
 |
 +--+ fork();
 |  |
 親 子

であることが、確認できた。最初から実行している訳では無い。

あぁ・・・昨日のを読み間違えていた・・・fork(2)は"プロセスを複製する"。

つまり、fork(2)は、プログラム(実行ファイル)を複製している訳ではなく、メモリ(スタックとヒープ領域)、CPUのレジスタをコピーし、新たにプロセスを作るってことだ。execした時点でメモリを作りなおせばいい。あくまで僕の予測。

残念ながらプロセスを追える程のデバッグテクは持ってないので、これから参考書を読んでみる。

・・・買って以来はじめてLinuxカーネル2.6解読室読んで(眺めて)みた。PART2〜PART3に渡り、詳細に書かれている。やはりメモリ、プロセス関連は相当重要なポイントでありOSの根幹を支えていることが判る。が、難しすぎるので、概要を掴む程度に抑えておこう・・・。

大体予測通りの事をしていることが判ったので満足しておくことにする。

ふつうのLinuxプログラミングの練習問題が相当面白そうなので、この本を読み終わったらやってみたい。

"パイプを実装せよ"

えぇぇぇ。

追記 2007-06-02

「forkは親のデータ、スタック、ヒープを完全にコピーすることはない」

fork以前のメモリ領域は親と子で共有し、読み取り専用にする。共有領域に変更があったページだけを複製する。

詳解UNIXプログラミング 8.3を熟読せよ。