簡體   English   中英

什么時候調用fork()?

[英]When to call fork()?

我這里有兩個代碼示例

#include<stdio.h>
int main()
{
        int i = 0;
        i++;
        fork();
        printf("i - %d, pid - %d, addr -%p\n",i,getpid(),&i);
        return 0;
}

user@Ubuntu ~/Arena/c $ ./a
i - 1, pid - 6765, addr -0x7fffd892950c
i - 1, pid - 6766, addr -0x7fffd892950c

我的第二個程序是

#include<stdio.h>
int main()
{
        int i = 0;
        i++;
        printf("i - %d, pid - %d, addr -%p\n",i,getpid(),&i);
        fork();
        return 0;
}

user@Ubuntu ~/Arena/c $ ./b
i - 1, pid - 6772, addr -0x7fff39120f2c

and execute it, if it is that way why is the position of fork() call making such a big difference ? 據我所知,fork應該創建並執行它,如果那樣,為什么fork()調用的位置會產生很大的不同? 有人可以解釋為什么我的第二個程序中省略了printf嗎?

fork()創建該進程的副本,並在您調用fork()時繼續執行兩個進程。

因此,在第二個示例中,當只有一個進程時,將在fork之前執行printf。

Fork創建了程序的完整副本,但是從調用fork那一點開始繼續執行。 將fork放在printf之后,看看會發生什么。

通常,在fork調用之后會檢查一下fork返回了孩子的pid 如果是這樣,那么您當前正在運行的進程就是接收孩子的pid的父級,以便能夠管理該孩子;如果沒有,則您當前正在運行的進程就是該孩子。

為了進一步啟發,請嘗試:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    int i = 0;
    i++;
    printf("A: i - %d, pid - %d, addr -%p", i, getpid(), &i);
    fork();
    printf("\nB: i - %d, pid - %d, addr -%p\n", i, getpid(), &i);
    return 0;
}

第一個printf()不包含換行符,因此輸出保留在內存中。 第二個printf()包含換行符,因此輸出將在程序分叉之后出現。 您應該在標記為A的兩行中看到相同的信息; 您應該在標記為B的兩行中看到不同的信息。

在單線程應用程序中,除了PID,Parent PID和fork()返回的值之外,父進程和子進程幾乎相同。 有關完整的詳細信息,請參見fork()的POSIX規范。

暫無
暫無

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

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