2012-06-12 4 views
8

私は大きなバッファを持っている:フォークなし)(フォークのコピー・オン・ライト動作をゲットING、()

char *buf = malloc(1000000000); // 1GB 

私は新しいプロセスをフォークした場合、それはとメモリを共有しBUFを持っているでしょうどちらか一方がそれに書き込むまで、親のbuf。それでも、新しい4KiBブロックはカーネルによって1つだけ割り当てられる必要があり、残りは引き続き共有されます。

私はbufのコピーを作成したいと思いますが、私はコピーを少し変更するつもりです。私はフォークせずにコピーオンライトの動作をしたいです。 (あなたがフォークするときに自由に得るように)

これは可能ですか?

+0

確かに、それは「無料」ではありません。あなた自身のメモリ管理を行い、変更を追跡する必要があります。 –

+1

はい、私は「無料」したいです。私はmmapベースのソリューションがあるのか​​、それとも私が想像していなかったものがあるのか​​疑問に思っていました。 – fadedbee

+0

おそらくMAP_ANONYMOUSとMAP_PRIVATEを使ったmmapがその仕事をしますか? – fadedbee

答えて

9

ディスク上にファイルを作成するか、ブロック用のPOSIX共有メモリセグメント(shm_open)を作成します。初めて、MAP_SHAREDにマップしてください。 COWにコピーして切り替える準備ができたら、元の地図の上に地図を表示するにはにMAP_FIXEDMAP_PRIVATEと、もう一度コピーするにはMAP_PRIVATEにもう一度お電話ください。これは、あなたが望む効果を得るはずです。

+1

それは非常に励みになりますが、私はそれを働かせることはできません。バスエラーが発生します(13行目)。 fd == 3.私の愚かな間違いを指摘できますか? https://gist.github.com/2924412 – fadedbee

+1

共有メモリセグメントにサイズを与えるには 'ftruncate'が必要です。初期サイズはゼロです。 –

+0

ありがとうございます。私はftruncateを追加しましたが、今は14行目のバスエラーではなくsegfaultを持っています。 – fadedbee

関連する問題