一直以来对于execve的解释都是用新的可执行文件覆盖原有的进程地址空间,我一直以来都是这么理解的,man手册的解释: "This causes the program that is currently being run by the calling process to be replaced with a new program, with a newly initialized stack, heap, and (initialized and uninitialized) data segments."
本书中P84中原文也是: "将可执行文件的数据段和代码段载入当前进程的地址空间中".但是这个解释太具有误导性了,让我一直以为是直接覆盖当前现有的进程地址空间,这就导致在理解vfork的时候产生很大的不解,因为在vfork中子进程和父进程是完全共享地址空间的,那么子进程执行exec不会导致父进程的地址空间被覆盖吗?
其实是因为execve并不是覆盖操作,而是新创建一个虚拟地址空间,然后将之前的虚拟地址空间遗弃(引用计数-1),本书的P91中也提到了,但是由于当前几乎所有的解释都用了覆盖这个词语,因此具有很大的误导性,我建议本书在介绍exec的时候能更加详细的介绍其实现原理.