在Linux的许多程序和手册页中,我已经看到了使用fork()
的代码。为什么我们需要使用fork()
及其目的是什么?
最佳答案
fork()
是在Unix中创建新进程的方式。调用fork
时,您将创建自己的具有自己的address space的进程的副本。这样一来,多个任务就可以彼此独立运行,就像它们各自拥有计算机的全部内存一样。
这是fork
的一些用法示例:
fork
运行从命令行调用的程序。 fork
创建多个服务器进程,每个进程都在其自己的地址空间中处理请求。如果一个人死亡或泄漏内存,其他人则不受影响,因此它起着容错机制的作用。 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讨论了现代操作系统中进程,线程和并发的工作方式。