2

我很好奇从设置了大多数标志的进程调用 clone 的行为(以便两个进程共享一个执行上下文,即共享地址空间、文件描述符 talbe 等)。我无法使用在线材料完全回答我的问题。

现在假设我从克隆的进程中调用 execve。这会将进程的映像替换为全新的映像,破坏附加的内存段,丢弃分配的内存等,但是父进程会发生什么?给定这些共享(例如,所有分配的内存区域),它们是否也会被释放?

新的 execved 进程是否仍与父进程共享地址空间?

4

2 回答 2

1

共享对象未映射或未链接,但从共享的角度来看。

假设您有 3 个进程/线程,它们都从 0x1000 开始共享内存。

其中一个执行 execve。然后它将shm_unlink(2)在 0x1000 上执行一次。 shm_unlink(2)会尝试的unlink(2)

现在对于使用该内存范围的每个进程/线程都有一个计数器。在我们的例子中,计数器在 之前设置为 3,之后execve(2)将设置为 2。没有失忆。

正如您所说,当没有进程不再使用它时,内存将被“销毁”。当计数器为 0 时。

所有共享对象也是如此。有关调用哪些系统调用以及它们如何“破坏”共享对象的列表,请查看execve(2) 手册页中的链接。搜索这个短语:

All process attributes are preserved during an execve(), except the following
于 2012-08-03T09:29:52.147 回答
0

父进程不受 execve 影响。毕竟这是一个不同的过程。进程总是必须使用一些显式的方法进行通信(文件、管道、IPC,如共享内存、信号……)。由于所有这些都在执行 exec 的子进程中被破坏,因此在再次明确设置之前无法进行通信。

于 2012-08-03T09:06:57.303 回答