在子进程中,有什么方法可以确定它是作为具有覆盖内存的 fork 还是作为具有共享内存的 vfork 启动的?
基本上,我们的日志引擎需要在 vfork 中更加小心(而不是记录某些类别的活动)。在 fork 中,它需要以 vfork 中没有的方式与父进程合作。我们知道如何做这两件事,但不知道如何决定。
我知道我可能会拦截 fork/vfork/clone 调用,并将 fork/vfork/mapping 状态存储为一个标志,但如果有一个 API 调用孩子可以进行以确定其自己的状态,它会使生活变得更简单。
额外标记:理想情况下,我还需要在库中找到任何已完成 fork 或 vfork 的地方,然后将其回调到我们的代码中。那怎么会发生呢?我们拥有的至少一个库提供了一个类似 popen 的 API,其中客户端回调在 exec 之前从 fork 子调用。显然,该回调的实用性在 vfork 中受到很大限制。