[英]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.