克隆,分叉,vfork行为后跟一个exec

时间:2012-08-03 09:01:23

标签: c multithreading process fork system-calls

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

现在假设我从克隆进程调用execve。这将用一个全新的映像替换进程的映像,破坏附加的内存段,丢弃已分配的内存等,但父进程会发生什么?鉴于这些份额(例如,所有malloced内存区域),它们是否也被取消分配?

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

2 个答案:

答案 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的孩子中被破坏,因此在明确重新设置之前无法进行通信。