これが起こっていないことを理解するために使用したサンプルコードを次に示します。私の目標は、親が子が行った変更を確認することmyint
です(この特定の例では、親に print 、または子が設定した値を表示struct ss
したいと思います)。PARENT myint = 1
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
struct ss {
int myint;
};
int main(void) {
int pid;
struct ss *s = (struct ss *)malloc(sizeof(struct ss));
s->myint = 0;
if ((pid = fork()) < 0) return 1;
switch (pid) {
case -1: return 1;
case 0:
printf("CHILD address = %p\n", s);
s->myint = 1;
printf("CHILD myint = %d\n", s);
printf("CHILD done.\n");
// free(s);
return 0;
default:
printf("PARENT address = %p\n", s);
waitpid(pid, NULL, 0);
printf("PARENT myint = %d\n", s->myint);
printf("PARENT done.\n");
break;
}
free(s);
return 0;
}
これが私が得る出力の1つです:
PARENT address = 0x1a79010
CHILD address = 0x1a79010
CHILD myint = 1
CHILD done.
PARENT myint = 0
PARENT done.
TBH、これは私を完全に困惑させました: PARENT と CHILD の両方が同じアドレスを持っているのはなぜですか? さらに、呼び出しスタックを除くすべてのメモリは、プロセスのスレッド間で共有されると思いました。ここで見落としている些細なエラーはありますか?