簡體   English   中英

在 fork() 之后地址、值和指針會發生什么變化

[英]What happens to address's, values, and pointers after a fork()

我正在研究一個問題,我將在 C 中檢查fork()調用之前和之后的值和地址。我的方法是顯示變量值和地址,假設在fork()之后看到地址的差異。 令我驚訝的是,上述變量的地址保持不變。

我的問題是為什么它們相同? 如果我改變孩子的變量會發生什么? 父母和孩子都會改變嗎? 如果沒有,我如何能夠更改該地址中的值,而父和子的地址都相同。

代碼(供參考):

#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

子進程擁有父地址空間的副本。 在現代系統中,地址是虛擬化的,因此任何特定的指針地址都可以在一個進程中映射到與另一個進程中不同的物理地址

如果我改變孩子的變量會發生什么? 父母和孩子都會改變嗎?

子進程擁有自己的變量副本,因此更改子進程中的變量不會影響父進程中變量的值。

如果沒有,我如何能夠更改該地址中的值,而父母和孩子的地址都相同。

這是因為兩個進程中的相同地址映射到不同的物理地址。

地址是相同的,但不指向相同的內存。 每個進程都有自己的地址空間。 這是通過虛擬內存在現代系統上實現的——在舊系統上,這將通過基於段的尋址或簡單的交換(卸載一個進程並將另一個進程加載到同一內存區域中)來實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM