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

标签 c linux fork vfork

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

最佳答案

所有不是专门为在 vfork() 下工作而设计的代码在 vfork() 下不起作用.
从技术上讲,您可以检查您是否在 vfork() 中 child 打电话mmap()并检查内存映射是否由 /proc 下的父进程继承.不要写这个代码。这是一个非常糟糕的主意,没有人应该使用它。真的,这是判断您是否在 vfork() 中的最佳方式 child 与否将传递该信息。但重点来了。你打算怎么办?
你不能做的事情vfork()子包括调用 fprintf() , puts() , fopen() ,或任何其他标准 I/O 函数,也不是 malloc()对于这个问题。除非代码经过精心设计,否则最好根本不要调用日志框架,如果它经过精心设计,则不需要知道。更好的设计很可能是在调用 vfork() 之前记录您的意图。首先。
您在评论中询问了一个调用 fork() 的图书馆然后回到你的代码。这已经有点糟糕了。但是任何图书馆都不应该调用 vfork()并返回到您的代码中,而无需明确记录这样做。 vfork()是一个受限制的环境,调用不应该出现在该环境中的事情真的不应该发生。

关于一个fork child能判断它是fork还是vfork吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66548922/

相关文章:

linux - 如何更改cmake缓存和构建文件目录

c - 为什么进程之间没有切换

c - 如何用 fork 和 pipe 制作工艺环?

C - fork 和 sleep 函数出现意外结果

c - 如何使用 TCP/IP 堆栈对 PIC18 上的引导加载程序进行单元测试?

c++ - volatile 是在 C/C++ 中生成单字节原子的正确方法吗?

linux - Linux 中时间戳的值

c - 读取文件(使用稀疏矩阵)并生成 CSR

c++ - c 中的 fork() 命令——这段简单代码的输出是什么?

linux - 可加载内核 mdoule 的 insmod 导致信号 4 异常