Process
在 fork() 之後,子程序從哪裡開始執行?
我正在嘗試學習 UNIX 程式,遇到了一個關於 fork() 的問題。我知道 fork() 創建了與目前正在執行的程序相同的程序,但它從哪裡開始呢?例如,如果我有程式碼
int main (int argc, char **argv) { int retval; printf ("This is most definitely the parent process\n"); fflush (stdout); retval = fork (); printf ("Which process printed this?\n"); return (EXIT_SUCCESS); }
輸出是:
這絕對是父程序
哪個程序列印了這個?
這是哪個程序列印的?
我認為這
fork()
會創建一個相同的過程,所以我最初認為在那個程序中,fork()
呼叫將被遞歸呼叫。fork()
我猜想在通話後開始創建的新程序fork()
?如果我添加以下程式碼,以區分父程序和子程序,
if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid); else printf ("This is the child, pid is %d\n",getpid ());
在 fork() 呼叫之後,子程序從哪裡開始執行?
新程序將在
fork()
呼叫中創建,並將像父程序一樣從它返回開始。返回值(您儲存在 中retval
)fork()
將是:
- 0 在子程序中
- 父程序中子程序的PID
- 如果失敗,則在父母中為-1(自然沒有孩子)
您的測試程式碼工作正常;它儲存來自
fork()
in的返回值child_pid
並用於if
檢查它是否為 0(儘管它不檢查錯誤)
我認為 fork() 創建了一個相同的程序,所以我最初認為在那個程序中,fork() 呼叫將被遞歸呼叫。我猜從 fork() 創建的新程序在 fork() 呼叫之後開始?
是的。讓我們給行編號:
int main (int argc, char **argv) { int retval; /* 1 */ printf ("This is most definitely the parent process\n"); /* 2 */ fflush (stdout); /* 3 */ retval = fork (); /* 4 */ printf ("Which process printed this?\n"); /* 5 */ return (EXIT_SUCCESS); /* 6 */ }
執行流程為:
caller process fork() → ... ↘ original program exec() → 2 → 3 → 4 → 5 → 6 ↘ forked program 5 → 6
…這準確解釋了您收到的輸出。
如果您想知道原始程序和分叉程序的行為可能有何不同,因為它們必然共享相同的程式碼,請參閱Michael Mrozek 的回答。