0

これが起こっていないことを理解するために使用したサンプルコードを次に示します。私の目標は、親が子が行った変更を確認すること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 の両方が同じアドレスを持っているのはなぜですか? さらに、呼び出しスタックを除くすべてのメモリは、プロセスのスレッド間で共有されると思いました。ここで見落としている些細なエラーはありますか?

4

3 に答える 3

3

fork()新しいスレッドを開始せず、プロセス全体を複製します。したがってfork()、同じメモリを持つ 2 つのプロセスを取得すると、変数アドレスは同じになります。

于 2013-11-15T11:00:00.900 に答える
0

ウィリスの言うとおりです。目標を実現したい場合は、POSIX pthread を使用してスレッドを作成することをお勧めします。

于 2013-11-15T11:14:46.897 に答える