我很好奇从大多数标志设置的进程调用clone的行为(这样两个进程共享一个执行上下文,即共享地址空间,文件描述符talbe等)。我无法在线使用这些材料完全回答我的问题。
现在假设我从克隆进程调用execve。这将用一个全新的映像替换进程的映像,破坏附加的内存段,丢弃已分配的内存等,但父进程会发生什么?鉴于这些份额(例如,所有malloced内存区域),它们是否也被取消分配?
新执行的进程是否仍与父级共享地址空间?
答案 0 :(得分:1)
共享对象未映射或取消链接,但是从共享角度来看。
假设您有3个进程/线程,它们共享内存,从0x1000开始。
其中一人做了一个人。然后它将在0x1000上执行shm_unlink(2)
。
shm_unlink(2)
会尝试unlink(2)
。
现在,对于使用该内存范围的每个进程/线程,都有一个计数器。在我们的例子中,计数器在execve(2)
之前设置为3,并且在它之后将设置为2。没有记忆丧失。
当没有进程正在使用它时,内存将被“销毁”。当计数器为0时。
同样适用于所有共享对象。有关调用哪些系统调用以及它们如何“销毁”共享对象的列表,请查看execve(2)
manpage中的链接。搜索这句话:
All process attributes are preserved during an execve(), except the following
答案 1 :(得分:0)
父进程不受execve的影响。毕竟这是一个不同的过程。进程总是必须使用一些显式方法进行通信(文件,管道,IPC,如共享内存,信号......)。由于所有这些都在执行exec的孩子中被破坏,因此在明确重新设置之前无法进行通信。