在Linux的许多程序和手册页中,我已经看到了使用fork()的代码。为什么我们需要使用fork()及其目的是什么?

最佳答案

fork()是在Unix中创建新进程的方式。调用fork时,您将创建自己的具有自己的address space的进程的副本。这样一来,多个任务就可以彼此独立运行,就像它们各自拥有计算机的全部内存一样。

这是fork的一些用法示例:

  • 您的shell使用fork运行从命令行调用的程序。
  • apache这样的Web服务器使用fork创建多个服务器进程,每个进程都在其自己的地址空间中处理请求。如果一个人死亡或泄漏内存,其他人则不受影响,因此它起着容错机制的作用。
  • Google Chrome使用fork在单独的进程中处理每个页面。这样可以防止一页上的客户端代码使整个浏览器崩溃。
  • fork用于在某些并行程序(如使用MPI编写的程序)中生成进程。注意,这与使用threads不同,后者没有自己的地址空间,并且存在于进程中。
  • 脚本语言间接使用fork启动子进程。例如,每当您在Python中使用诸如 subprocess.Popen 之类的命令时,您就对一个子进程进行fork并读取其输出。这使程序可以一起工作。

  • shell中fork的典型用法如下所示:
    int child_process_id = fork();
    if (child_process_id) {
        // Fork returns a valid pid in the parent process.  Parent executes this.
    
        // wait for the child process to complete
        waitpid(child_process_id, ...);  // omitted extra args for brevity
    
        // child process finished!
    } else {
        // Fork returns 0 in the child process.  Child executes this.
    
        // new argv array for the child process
        const char *argv[] = {"arg1", "arg2", "arg3", NULL};
    
        // now start executing some other program
        exec("/path/to/a/program", argv);
    }
    

    该 shell 程序使用exec生成一个子进程,并等待其完成,然后继续其自身的执行。请注意,您不必以这种方式使用fork。您总是可以产生许多子进程,就像并行程序可能会这样做一样,并且每个子进程可能会同时运行一个程序。基本上,每当您在Unix系统中创建新进程时,都在使用fork()。对于Windows等效版本,请查看 CreateProcess

    如果需要更多示例和更长的解释,Wikipedia的摘要不错。 here are some slides讨论了现代操作系统中进程,线程和并发的工作方式。

    10-07 16:23
    查看更多