在内存分配效率方面,可以说孩子代码中的fork()之后,如果我使用execve()执行程序,则这将比不使用execve()执行的同一程序更有效,因为孩子赢得了还没有分配父亲的栈和堆,只有自己的?

纳非(Naife)示例:

没有执行

 [..some father code...]
int i;
if(!fork()) {
 sum() //from an #include "porg.h"
}


与执行

 [..some father code...]

if(!fork()) {
 execve("sum", NULL, NULL); //sum is a program which executes i=2+3
}


在内存分配方面第二更好?
是最好替换我的进程的整个虚拟地址空间,还是最好通过调用另一个包含在#include“ prog”中的程序中的函数来运行所提到的代码,就完成的操作数而言是这样,以及在程序执行过程中所携带的内存方面呢?

最佳答案

仔细阅读有关Linux或POSIX编程的书,也许是旧的ALP。另请阅读intro(2)fork(2)execve(2)

成功执行execve后,根据执行的virtual address space可执行文件替换并重新初始化了process的整个ELF(请参见elf(5);因此,execve不会返回,除非失败) 。

因此,您的sum程序看不到前一个执行该程序的程序(强制性argvenviron除外,它们由execve复制)。顺便说一句,您对execve的使用是错误的。您应该提供一些argv数组和一些environ数组(两者都应为非null,argv应该为非空,并且都应以NULL字符串结尾)...您经常会喜欢一些exec*(3)函数。

在成功完成fork之后,两个(子级和父级)进程都具有自己的虚拟地址空间(最初,几乎相同的副本)。顺便说一句,您的代码忘记了检查fork的失败。


  在内存分配方面第二更好?


因此,这个问题毫无道理。整个“内存”(实际上是虚拟地址空间)已被重置并重新初始化(包括调用堆栈和堆)。

您可以使用/proc/探索进程的虚拟地址空间。请参见proc(5)。尝试使用cat /proc/$$/mapscat /proc/self/maps可以更好地了解虚拟地址空间。

还可以玩strace(1)来理解某些程序或过程完成的system calls。尝试例如strace date(另请参见this)。


  比没有execve()执行的相同程序


这是不可能的,因为execve是执行程序的唯一方法(当然init除外,今天称为systemd-参见init(1),它在启动时由内核神奇地启动;还有一些其他方式)怪异的内核启动过程....)

关于linux - fork()和execve()效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48546755/

10-11 03:48