fork() 实际上从哪里开始?

5 programming process

我正在尝试学习 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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

This is most definitely the parent process
Which process printed this?
Which process printed this?
Run Code Online (Sandbox Code Playgroud)

我认为 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 ());
Run Code Online (Sandbox Code Playgroud)

在 fork() 调用之后,子进程从哪里开始执行?

Bre*_*bad 5

实际的fork分叉发生在fork()原语内部。

您可以想象在 的代码中fork,系统调用实际上复制了进程并在同一点开始执行,但略有不同:

  • 父进程fork函数会返回子进程的进程ID
  • 子进程fork函数将返回 0。

因此你知道你在编程过程中的位置,例如

  if (fork())
  {
     printf("Parent speaking\n");
     // parent's tasks
  }
  else
  {
     printf("Child here\n");
     // child's tasks
  }
Run Code Online (Sandbox Code Playgroud)