在内存分配效率方面,可以说孩子代码中的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
程序看不到前一个执行该程序的程序(强制性argv
和environ
除外,它们由execve
复制)。顺便说一句,您对execve
的使用是错误的。您应该提供一些argv
数组和一些environ
数组(两者都应为非null,argv
应该为非空,并且都应以NULL
字符串结尾)...您经常会喜欢一些exec*(3)函数。
在成功完成fork
之后,两个(子级和父级)进程都具有自己的虚拟地址空间(最初,几乎相同的副本)。顺便说一句,您的代码忘记了检查fork
的失败。
在内存分配方面第二更好?
因此,这个问题毫无道理。整个“内存”(实际上是虚拟地址空间)已被重置并重新初始化(包括调用堆栈和堆)。
您可以使用/proc/
探索进程的虚拟地址空间。请参见proc(5)。尝试使用cat /proc/$$/maps
和cat /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/