c - fork() 的目的是什么?

标签 c unix posix fork

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

最佳答案

fork() 是您在 Unix 中创建新进程的方式。当您调用 fork 时,您正在创建您自己的进程的副本,它有自己的 address space。 .这允许多个任务彼此独立运行,就好像它们各自拥有机器的全部内存一样。

以下是 fork 的一些示例用法:

  1. 你的 shell使用 fork 运行您从命令行调用的程序。
  2. Web 服务器,如 apache使用 fork 创建多个服务器进程,每个进程在自己的地址空间中处理请求。如果一个死亡或内存泄漏,其他不受影响,因此它起到了一种容错机制的作用。
  3. Google Chrome使用 fork 在单独的进程中处理每个页面。这将防止一个页面上的客户端代码导致整个浏览器崩溃。
  4. fork 用于在某些并行程序中生成进程(例如使用 MPI 编写的程序)。请注意,这不同于使用 threads ,它们没有自己的地址空间并且存在于进程中。
  5. 脚本语言使用fork 间接启动子进程。例如,每次您使用类似 subprocess.Popen 的命令时在 Python 中,您可以fork 一个子进程并读取它的输出。这使程序能够协同工作。

fork 在 shell 中的典型用法可能如下所示:

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此处介绍进程、线程和并发在现代操作系统中的工作方式。

关于c - fork() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/985051/

相关文章:

unix - 使用 awk 在每列中显示唯一值

c - 如何区分Escape和Escape Sequence

c - 打印到 stderr 时检查 fprintf 时出错

c - strcmp 或数组错误?

unix - 如何从 Kohana 3.2 升级到 3.3(实现 PSR-0)?

linux - 条件测试时 Shell 脚本权限被拒绝

c - OpenGL 项目存在 Codeblocks 编译问题

c - 安全浮点除法

c - C中同时独立执行两个函数

c - 使用 POSIX IO 原语逐行读取文件