Process

在 fork() 之後,子程序從哪裡開始執行?

  • August 17, 2013

我正在嘗試學習 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()呼叫中創建,並將像父程序一樣從它返回開始。返回值(您儲存在 中retvalfork()將是:

  • 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 的回答。

引用自:https://unix.stackexchange.com/questions/4377