一个forkchild能判断它是fork还是vfork吗?

在子进程中,有什么方法可以确定它是作为具有覆盖内存的 fork 还是作为具有共享内存的 vfork 启动的?

基本上,我们的日志引擎需要在 vfork 中更加小心(而不是记录某些类别的活动)。在 fork 中,它需要以 vfork 中没有的方式与父进程合作。我们知道如何做这两件事,但不知道如何决定。

我知道我可能会拦截 fork/vfork/clone 调用,并将 fork/vfork/mapping 状态存储为一个标志,但是如果孩子可以通过 API 调用来确定它自己的状态,这会让生活变得更简单。

额外标记:理想情况下,我还需要在库中选择任何已经完成 fork 或 vfork 的地方,然后再调用我们的代码。那怎么会发生呢?我们至少有一个库提供了类似 popen 的 API,其中在 exec 之前从 fork 子级调用客户端回调。显然,该回调的效用在 vfork 中受到显着限制。

回答

所有不是专门设计用于vfork()vfork().

从技术上讲,您可以vfork()通过调用mmap()并检查内存映射是否由/proc. 不要写这个代码。这是一个非常糟糕的主意,没有人应该使用它。真的,判断你是否是vfork()孩子的最好方法就是传递这些信息。但重点来了。你打算怎么办?

你不能做的事情vfork()的孩子包括呼叫fprintf()puts()fopen(),或任何其他标准的I / O功能,也没有malloc()对这一问题。除非代码经过精心设计,否则最好根本不要调用日志框架,如果它经过精心设计,则不需要知道。更好的设计很可能是vfork()在首先调用之前记录您的意图。

您在评论中询问库调用fork(),然后返回到您的代码中。这已经有点糟糕了。但是,没有图书馆应该永远永远调用vfork()和返回到你的代码没有被明确记录,因为这样做。vfork()是一个受限制的环境,调用不应该出现在该环境中的事情真的不应该发生。


以上是一个forkchild能判断它是fork还是vfork吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>