c - fork() 之后地址、值和指针会发生什么

标签 c fork parent-child memory-address virtual-memory

我正在研究一个问题,我要在 C 中检查 fork() 调用前后的值和地址。我的方法是显示变量值和地址,假设看到一个fork() 之后的地址不同。令我惊讶的是,上述变量的地址保持不变。

我的问题是为什么它们相同?如果我更改子变量中的变量会怎样?它会改变 parent 和 child 吗?如果不是,我如何才能更改该地址中的值,同时父子地址相同。

代码(供引用):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
  int status;
  pid_t pid;

  int a = 123456;
  float b = 123.456;
  char c = 'Z';
  int *e;
  e=&a;

  //Retriving address's
  void *ap=&a, *bp=&b, *cp=&c, *ep=&e;

    printf("Parent Before Fork:\n");
    printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
    printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
    printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
    printf("Pointer e: \tvalue = %p, address = %p\n", e, ep);  

    pid = fork();

    if(pid > 0)
    {
      pid = wait(&status);
      printf("\nParent After Fork:\n");
      printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
      printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
      printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
      printf("Pointer e: \tvalue = %p, address = %p\n", e, ep);

      sleep(1);
    }
    else if(pid == 0)
    {
      printf("\nChild After Fork:\n");
      printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
      printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
      printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
      printf("Pointer e: \tvalue = %p, address = %p\n", e, ep);
   }
   else
     printf("fork() did not work");

return 0; 
}

输出(供引用):

Parent Before Fork:
Integer a:  value = 123456,         address = 0x7fff8b8e378c
Float b:    value = 123.456001,     address = 0x7fff8b8e3790
Char c:     value = Z,              address = 0x7fff8b8e3787
Pointer e:  value = 0x7fff8b8e378c, address = 0x7fff8b8e3798

Child After Fork:
Integer a:  value = 123456,         address = 0x7fff8b8e378c
Float b:    value = 123.456001,     address = 0x7fff8b8e3790
Char c:     value = Z,              address = 0x7fff8b8e3787
Pointer e:  value = 0x7fff8b8e378c, address = 0x7fff8b8e3798

Parent After Fork:
Integer a:  value = 123456,         address = 0x7fff8b8e378c
Float b:    value = 123.456001,     address = 0x7fff8b8e3790
Char c:     value = Z,              address = 0x7fff8b8e3787
Pointer e:  value = 0x7fff8b8e378c, address = 0x7fff8b8e3798

最佳答案

子进程拥有父地址空间的副本。在现代系统中,地址是虚拟化的,因此任何特定的指针地址都可以在一个进程中映射到与在另一个进程中不同的物理地址

What happens if I change a variable in the child? Will it change in both parent and child?

子项有自己的变量副本,因此更改子项中的变量不会影响父项中变量的值。

If not, how am I able to change the value in that address while the addres is the same for both parent and child.

这是由于两个进程中的相同地址映射到不同的物理地址。

关于c - fork() 之后地址、值和指针会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33021639/

相关文章:

c - OpenCL 设备端排队内核和本地内存

c - gdb 如何在 linux 上调试多线程守护程序时中断新线程

c - C中的进程同步不会第一次执行

并发进程

oracle - Oracle中的父子关系

c - 将二维指针数组传递给函数 C

c - 32 位无符号数与 32 位有符号数之间的加法

linux - 虚拟地址到物理地址的映射

c - 导航功能将其所有输出打印两次

c# - 通过转换 (ChildClass)parentObject 调用子构造函数;跟踪修订