什麼是叉返回?
回答
fork()
在父進程中被調用。然後產生一個子進程。子進程產生時,fork()
已完成執行。
在這一點上,fork()
已準備好返回,但它返回一個不同的值,具體取決於它是否在父級或子級。在子進程中,它返回0,並在父進程/線程中返回子進程ID。
我不確定手冊如何更清晰! fork()
創建一個新的進程,所以你現在有兩個相同的進程。爲了區分它們,fork()
的返回值不同。在原始過程中,您將獲得子進程的PID。在子過程中,你會得到0
因此,一個規範的使用方法如下:
p = fork();
if (0 == p)
{
// We're the child process
}
else if (p > 0)
{
// We're the parent process
}
else
{
// We're the parent process, but child couldn't be created
}
這是最酷的部分。 它等於兩者。
呃,不是真的。但是一旦fork
返回,您現在有兩個程序正在運行!兩個過程。你可以把它們想象成替代宇宙。其中一個返回值是0
。另一方面,這是新工藝的ID
!
通常你有這樣的事情:
p = fork();
if (p == 0){
printf("I am a child process!\n");
//Do child things
}
else {
printf("I am the parent process! Child is number %d\n", p);
//Do parenty things
}
在這種情況下,兩個字符串將獲得印刷,但通過不同的工藝!
您有父母/子女倒退。 – interjay 2011-04-07 07:56:12
@interjay:哎呀!謝謝。固定。 – 2011-04-07 07:58:54
同時檢查錯誤(-1 == p)。 – 2016-11-24 20:14:19
一旦fork
被執行,你有兩個進程。該調用爲每個進程返回不同的值。
如果你做這樣的事情
int f;
f = fork();
if (f == 0) {
printf("I am the child\n");
} else {
printf("I am the parent and the childs pid is %d\n",f);
}
你會看到兩個打印的信息。他們正在通過兩個獨立的流程進行打印。這是他們可以區分創建的兩個過程的方式。
當它返回0時,意味着'fork'沒有創建一個進程,對吧? – compiler 2011-04-07 08:01:06
不,這意味着你在孩子的過程中。 「不創建流程」意味着只有一個流程。如果返回「-1」,則意味着沒有創建子項。手冊頁指出了這一點。 – 2011-04-07 08:04:20
什麼時候不創建孩子?如果我在while循環中使用'fork()',我會獲得-1值嗎? – Heisenberg 2013-10-07 14:25:55
p = fork(); /* assume no errors */ /* you now have two */ /* programs running */ -------------------- if (p > 0) { | if (p == 0) { printf("parent\n"); | printf("child\n"); ... | ...
過程的執行向樹,你只知道你的單親(getppid()
)的結構。總之,fork()
像許多其他系統函數一樣返回-1
錯誤,非零值對於fork調用(父級)的發起者知道其新子pid很有用。
沒有什麼作爲例子一樣好:
/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h> /* fork(), getpid() */
#include <stdio.h>
int main(int argc, char* argv[])
{
int pid;
printf("Entry point: my pid is %d, parent pid is %d\n",
getpid(), getppid());
pid = fork();
if (pid == 0) {
printf("Child: my pid is %d, parent pid is %d\n",
getpid(), getppid());
}
else if (pid > 0) {
printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
getpid(), getppid(), pid);
}
else {
printf("Parent: oops! can not create a child (my pid is %d)\n",
getpid());
}
return 0;
}
而結果(是bash PID 2249,在這種情況下):
Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051
如果你需要共享一些資源(文件,父pid等),看看clone()
(對於GNU C庫,也可能是其他的)
Fork創建一個重複的進程和一個新的進程上下文。當它返回一個0值時,這意味着一個子進程正在運行,但是當它返回另一個值,這意味着一個父進程正在運行。我們通常使用wait語句,以便子進程完成並且父進程開始執行。
我認爲它的工作原理是這樣的: 當pid = fork()時,代碼應該執行兩次,一個在當前進程中,一個在子進程中。 所以它解釋了爲什麼if/else都執行。 順序是,第一個當前進程,然後執行子進程。
訂單不保證(據我所知)。 – 2016-11-24 20:12:30
- 1. Jquery $() - 它返回什麼,什麼是$()[0]?
- 2. MongoDB:什麼是getLastError()返回
- 3. 是什麼PackageInfo.signatures返回?
- 4. 什麼是返回以下
- 5. 什麼是CvMatchShapes返回?
- 6. mysql_insert_id()返回的是什麼?
- 7. 什麼是「返回false」;做?
- 8. 什麼是「返回Not(S是沒有什麼)」迴歸
- 9. 返回什麼?
- 10. 什麼是返回2不是0?
- 11. 爲什麼我的線段交叉測試不會返回true?
- 12. 什麼是Scala中的「(x,y)」,實際返回的是什麼?
- 13. 對於返回任務的過程,什麼意思是什麼都不返回?
- 14. compareTo()返回什麼?
- 15. this.id返回什麼?
- 16. getCurrentPosition返回什麼?
- 17. wave.readframes返回什麼?
- 18. TelephonyManager.getNetworkCountryIso()返回什麼?
- 19. 什麼「master.dbo.xp_fixeddrives」返回
- 20. main()返回什麼?
- 21. classname.class返回什麼?
- 22. 什麼返回mysqli_insert_id()?
- 23. request.getParameter返回什麼?
- 24. $(...)。map()返回什麼?
- 25. mxGetPr返回什麼?
- 26. IO.sysopen返回什麼?
- 27. CGColorGetComponents()返回什麼?
- 28. setTimeout返回什麼?
- 29. int.class返回什麼
- 30. adapter.getItem()返回什麼?
有人可以在圖片中包含'getpid()'嗎? 'getpid()'在孩子返回0? – Shrinidhi 2011-04-07 08:47:02
@Shrinidhi:'fork()'也是。 – BoltClock 2011-04-07 08:50:51
它既是pid也是0.當fork被調用時,程序「分裂」成兩個 - 它自己和它的邪惡的雙胞胎。在原來的程序中,它是0.在邪惡的雙胞胎計劃中,它是pid。 – 2011-04-07 09:38:09