2015-10-04 64 views
0

我對fork()感到困惑。例如,下面的代碼的輸出是什麼?fork()過程如何工作(操作系統)

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

int value = 5; 

int main() { 
    pid_t pid; 
    pid = fork(); 
    if (pid == 0) { value += 15; return 0; } 
    else if (pid > 0>) { wait (NULL); printf (「Value = %d」, value); return 0} 
} 
+0

看看[這裏](HTTP:// www.cs.cf.ac.uk/Dave/C/node22.html),它應該是一個有用的教程! – Imdad

回答

3

功能fork()創建一個新的過程,它是原始工藝的完整副本。新進程擁有自己的內存和自己的所有變量副本。

在新的子進程中,返回的pid值爲零。孩子增加了15到它的可變value並退出該行:

if (pid == 0) { value += 15; return 0; } 

value是5在原工藝。原始父進程具有大於零pid和它進入:

else if (pid > 0) { wait (NULL); printf("Value = %d", value); return 0; } 

此行打印:Value = 5

1

的輸出將是「值= 5」。

fork函數將創建一個具有自己地址空間的新進程(子進程)。子進程將收到父進程數據區域,堆棧和堆棧的副本。因此,修改子進程中的變量value不會影響父進程中的變量value

1

也許你不知道或不太明白fork做什麼。像Orest Hera和reffox都表示,fork()跨越了一個新的過程。

你也應該知道,父進程(一次實際調用fork)將獲得子進程的pidfork結果。

子進程開始於點,其中fork結束並返回0,而不是,從而使該進程來檢查的機會,他們是誰:

var x = 7; 
pid = fork(); 

if(pid < 0) 
{ 
    perror("failing to create a child process"); 
    return SOME_ERROR; 
} 

if(pid == 0) 
{ 
    /* I'm the child process */ 
    x = 9; 
    /* only I see that, my dad doesn't even notice that this happened */ 
    ... 
} else { 
    /* I'm the parent process */ 
    ... 
    /* waiting for my child to die, 
     otherwise a zombie will be created, 
     and I DO mean a zombie */ 
    wait(0); 

    /* the child is gone, now I can do whatever I want to */ 

}