私は親プロセスと子プロセスを持つプログラムを持っています。 fork()の前に、親プロセスはmalloc()を呼び出し、配列をいくつかのデータで埋めました。 fork()の後、子はそのデータを必要とします。私は、パイプを使用することができることを知っているが、次のコードが動作するように表示されます。特に、fork()はLinuxのmalloc()から動的に割り当てられたメモリをどのように扱いますか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
char *array;
array = malloc(20);
strcpy(array, "Hello");
switch(fork()) {
case 0:
printf("Child array: %s\n", array);
strcpy(array, "Goodbye");
printf("Child array: %s\n", array);
free(array);
break;
case -1:
printf("Error with fork()\n");
break;
default:
printf("Parent array: %s\n", array);
sleep(1);
printf("Parent array: %s\n", array);
free(array);
}
return 0;
}
出力は次のとおりです。
Parent array: Hello
Child array: Hello
Child array: Goodbye
Parent array: Hello
私がスタックに割り当てられたデータが子供で利用可能であることを知っているが、ヒープに割り当てられたデータも子プロセスで使用できるように見えます。同様に、子はスタック上の親のデータを変更することはできません。子はそのヒープ上の親のデータを変更することはできません。だから私は子供がスタックとヒープの両方のデータの独自のコピーを取得すると仮定します。
これはLinuxでは常にそうですか?もしそうなら、これをサポートするドキュメントはどこですか?私はfork()のマニュアルページをチェックしましたが、ヒープ上に動的に割り当てられたメモリは特に記述しませんでした。
は、プロセスに割り当てられている各ページが(それはそれでスタックまたはヒープを持つ仮想メモリページである)、それにアクセスできるようにフォークプロセスのためにコピーされます。あなたに
OPコードには*競合状態はありません。 – SiegeX
このメモリを使用してプロセスが通信できなくなることはありません。 – abyx
Nitpick: 'mmap(MAP_SHARED)'と 'shmat'を考慮してください。 Cの "スタック"と "ヒープ"の範囲外ですが、あなたは "各ページ"と言っています... – ephemient