簡體   English   中英

令人困惑的叉系統調用

[英]confusing fork system call

我只是檢查fork系統調用的行為,我發現它非常混亂。 我在一個網站上看到了

Unix將精確復制父級的地址空間並將其提供給孩子。 因此,父進程和子進程具有單獨的地址空間

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

int main(void)
{
pid_t pid;
char y='Y';
char *ptr;
ptr=&y;
pid = fork();
if (pid == 0)
{
y='Z';
printf(" *** Child process  ***\n");
printf(" Address  is %p\n",ptr);
printf(" char value is %c\n",y);
sleep(5);
}
else
{
sleep(5);
printf("\n ***parent process ***\n",&y);
printf(" Address  is %p\n",ptr);
printf(" char value is %c\n",y);
}
}

上述程序的輸出是:

 *** Child process  ***
 Address  is 69002894
 char value is Z

 ***parent process ***
 Address  is 69002894
 char value is Y

所以從上面提到的陳述看來,孩子和父母似乎有separet地址空間。這就是為什么char值被單獨打印的原因以及為什么我在子進程和父進程中看到變量的地址相同。

請幫我理解這個!

基本上,虛擬內存的概念提供了一個過程視圖,就好像它是系統的唯一所有者一樣。 它感覺它可以訪問完整的內存。

但實際上,操作系統只給它一個虛擬內存,操作系統使用MMU映射到實際內存。

那么,在你的情況下發生的是,每個進程(父進程和子進程)都有自己的地址空間。 這對兩者都是分開的。 現在,地址空間指的是虛擬地址空間。

因此,雖然在父級和子級中都存在相同的地址,但這只是虛擬地址。 並且每個映射到不同的物理地址。

希望能幫助到你!!

你是對的。 一旦調用fork() ,就會存在兩個相同的進程。 因此, y的地址對於每個進程中的y副本是相同的。 兩個進程之間的唯一區別是,在一個中, fork()返回0 ,而在另一個中它返回子進程的PID。 您的程序正在使用該信息在父級和子級中執行不同的操作,因此您可以獲得適當的輸出。

在“現實生活”中,操作系統進行了大量優化,使fork() 非常快。 這意味着實際的物理行為可能不涉及內存空間的完整副本。 但是,從邏輯上講,您可以這樣對待它。

它們具有單獨的地址空間 - 這正是為什么允許相同的存儲器地址具有不同的值。 內存地址僅在進程的上下文中有意義。

地址221 P Street是一個獨立的建築,地址為221 C Street。 即使它們具有相同的地址編號,它們的內容也不同。

你必須用ptr替換pid 要獲取父ID和子ID,必須在printf(" Address is %p\\n",pid);使用pid printf(" Address is %p\\n",pid); 而不是ptr fork()程序運行后分為兩部分。 一個是孩子,另一個是父母。 如果從fork()之前使用的變量調用地址,您將獲得父和子的相同結果。

暫無
暫無

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

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