所以,我使用了fork()
,并且知道它的作用。作为一个初学者,我对它感到很害怕(而且我仍然没有完全理解它)。在网上可以找到的fork()
的一般描述是,它会复制当前进程并分配不同的PID、父PID,并且该进程将具有不同的地址空间。这都很好,然而,根据这个功能描述,一个初学者会想知道“为什么这个函数如此重要……为什么我要复制我的进程呢?”于是我开始思考,最终我发现这就是通过execve()
家族在当前进程中调用其他进程的方法。
我仍然不明白为什么你必须用这种方式来做?最合乎逻辑的事情应该是有一个你可以像调用其他函数一样调用的函数
create_process("executable_path+name",params..., more params);
该方法将产生一个新进程并在main()函数的开始运行它,并返回新的PID。
让我担心的是fork/execve方法可能会做一些不必要的工作。如果我的进程正在使用大量内存,内核会复制我的页表等信息吗?除非我已经使用了它,否则我敢肯定它实际上没有分配真正的内存。此外,如果我有线程会怎么样?对我来说,这似乎太混乱了。
几乎所有关于fork的描述都说它只是复制进程,并且在fork()调用之后启动新进程运行。这确实是发生的事情,但为什么会这样发生,为什么fork/execve是生成新进程的唯一方法,以及从当前进程创建新进程的最常见Unix方式是什么?是否有其他更有效的生成进程的方法?**这些方法不需要复制更多的内存。
这个主题讨论了同样的问题,但我觉得不太令人满意:
谢谢。