0

这是我曾经意识到这没有发生的示例代码。我的目标是让父母看到孩子所做的改变myintstruct 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;
}

这是我得到的输出之一:

PARENT address = 0x1a79010
CHILD address = 0x1a79010
CHILD myint = 1
CHILD done.
PARENT myint = 0
PARENT done.

TBH,这让我完全困惑:PARENT 和 CHILD 怎么有相同的地址,但很明显,由于某种原因,父母看不到孩子写到这个地址的值?此外,我认为除了调用堆栈之外的所有内存都是在进程的线程之间共享的。我在这里忽略了一些微不足道的错误吗?

4

3 回答 3

3

fork() does not start new thread, it does clone the whole process. So after fork() you've got two processes with identical memory, so variable addresses are the same.

于 2013-11-15T11:00:00.900 回答
0

正如威利斯所说。如果您想实现您的目标,您可能需要使用 POSIX pthread 来创建线程。

于 2013-11-15T11:14:46.897 回答
0

我已经在另一个主题中回答过,这是我的回答:您正在使用 fork()。它创建了一个与您的实际进程完全相同的进程,但它不共享相同的内存。如果您使用线程,所有内存寻址都将被共享,并且您需要同步对共享内存位置的访问以满足数据的一致性。

于 2013-11-15T12:27:55.260 回答