c - POSIX C 中 fork() 的重量更轻的替代品?

标签 c fork posix

在我阅读的手册页中,popen、system 等似乎倾向于调用 fork()。反过来,fork() 复制进程的整个内存状态。这看起来真的很繁重,尤其是在许多情况下,调用 fork() 的子进程几乎没有使用分配给父进程的内存。

所以,我的问题是,我能否在不复制父进程的整个内存状态的情况下获得类似 fork() 的行为?还是我遗漏了什么,例如 fork() 并不像它看起来那么重(比如,可能倾向于优化调用以避免不必要的内存重复)?

最佳答案

fork(2)是,因为所有syscalls ,从用户空间应用程序的角度来看,一个原始操作(但一些 C 库使用 clone(2) 来表示它)。它主要是一条机器指令 SYSCALLSYSENTER 从用户模式切换到内核模式,然后(最新版本的)Linux 内核正在做相当重要的处理。

它实际上非常有效(例如不到一毫秒,有时甚至不到十分之一)因为内核广泛使用惰性 copy-on-write在父进程和子进程之间共享页面的技术。实际复制将在稍后发生,时间为 page faults。 , 覆盖共享页面时。

forking有一个巨大的优势,因为一些其他程序的启动被委托(delegate)给 execve(2) :概念上很简单:父进程和子进程之间的唯一区别是 fork

的结果

顺便说一句,在 Linux 等 POSIX 系统上,fork(2)或合适的clone(2) equivalent 是创建进程的唯一方法(有一些您通常应该忽略的奇怪异常:内核正在创建一些进程,例如/sbin/init 等。 .), 自 vfork(2)已经过时了。

关于c - POSIX C 中 fork() 的重量更轻的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33246917/

相关文章:

c - C 中的 Shell 程序具有奇怪的 fork 行为

c - 如何只在前台杀死子进程?

linux - syslog:如果存储空间较少,它是否会删除旧日志

c -/bin/sh依赖哪些POSIX系统接口(interface)?

c - 为什么在这个程序中无限循环?

c - c中指向数组的指针

子进程执行父代码(fork 之前的行)

c - 当两个或多个线程或进程 ftruncate(2) 同一个文件时会发生什么?

python - 将unix时间戳列表转换为python中其他时区的日期和时间字符串列表

c++ - a/c++代码的编译到执行的过程是怎样的?