在 Linux 的许多程序和手册页中,我都看到过使用 fork()
的代码。为什么我们需要使用 fork()
,它的目的是什么?
最佳答案
fork()
是您在 Unix 中创建新进程的方式。当您调用 fork
时,您正在创建您自己的进程的副本,它有自己的 address space。 .这允许多个任务彼此独立运行,就好像它们各自拥有机器的全部内存一样。
以下是 fork
的一些示例用法:
- 你的 shell使用
fork
运行您从命令行调用的程序。 - Web 服务器,如 apache使用
fork
创建多个服务器进程,每个进程在自己的地址空间中处理请求。如果一个死亡或内存泄漏,其他不受影响,因此它起到了一种容错机制的作用。 - Google Chrome使用
fork
在单独的进程中处理每个页面。这将防止一个页面上的客户端代码导致整个浏览器崩溃。 fork
用于在某些并行程序中生成进程(例如使用 MPI 编写的程序)。请注意,这不同于使用 threads ,它们没有自己的地址空间并且存在于进程中。- 脚本语言使用
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/