【问题标题】:memory location of variable using fork [duplicate]使用fork的变量的内存位置[重复]
【发布时间】:2014-01-22 11:17:35
【问题描述】:

我很难理解程序的输出。使用fork() 后,变量inmem 的内存位置显示相同。 有人可以解释一下吗! 谢谢

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int inmem = 9;
int pid = fork();

if(!pid)
{
    printf("child inmem %d %p\n", inmem,&inmem);
    inmem = 8;
    printf("child inmem %d %p\n", inmem, &inmem);

}

else
{
    printf("parent inmem %d %p\n", inmem, &inmem);
    inmem = 5;
    printf("parent inmem %d %p\n", inmem, &inmem);

}
return 0
}

输出-

parent inmem 9 0x7ffff0acdfc8
parent inmem 5 0x7ffff0acdfc8
child inmem 9 0x7ffff0acdfc8
child inmem 8 0x7ffff0acdfc8

【问题讨论】:

  • 有一些系统调用在几个不同的进程之间共享​​>虚拟内存。请参阅 shm_overview(7)mmap(2)。您需要同步,请参阅sem_overview(7)。阅读Advanced Linux Programming
  • 为什么没有加入#include &lt;unistd.h&gt;
  • 请不要忽略编译器警告。使用-Wall 编译您的代码并注意,这一次,您将看到您需要将传递给printf 的指针转换(void *)
  • 在 gcc 中使用标志 -Wall -Werror -Wextra -pedantic -pedantic-errors。它将使您编写符合标准且安全的代码。

标签: c linux memory-management fork ambiguous


【解决方案1】:

fork 根据您的代码和地址创建您的流程的精确副本。这已经是必要的,因为 fork 之后的代码执行方式与之前相同,并且对变量具有相同的访问权限。但是,一旦进程被分叉,它们就不再同步,因此分配新内存可能会产生不同的地址。

【讨论】:

    【解决方案2】:

    fork() 之后,孩子将拥有separate address space。这个地址空间是指virtual address space。所以父母和孩子将拥有相同的地址,即虚拟地址。

    操作系统会将此virtual address 映射到具有不同physical address 的单独地址空间中

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多