在子进程内部,有没有办法确定它是通过叠加内存启动的fork,还是共享内存的vfork?
基本上,我们的日志引擎在vfork中需要更加小心(并且不记录某些类别的活动)。在fork中,它需要以一种vfork中不需要的方式与父进程合作。我们知道如何做这两件事,但不知道如何决定。
我知道我可能可以拦截fork/vfork/clone调用,并将fork/vfork/映射状态存储为标志,但如果有一个API调用子进程可以使用来确定自己的状态会使生活变得更简单。
额外加分:理想情况下,我还需要找到库中已经进行了fork或vfork并回调到我们代码的任何地方。怎么做呢?我们有至少一个类似于popen的API提供了一个客户端回调,在执行前从fork子进程中调用。显然,在vfork中该回调的实用性受到显著限制。
vfork()
,因为vfork()
子进程不得从调用它的函数中返回。编写一个 libc 包装器vfork() => clone()
由于寄存器压力而难以实现。 - Joshuavfork()
再次回归。posix_spawn()
是基于vfork()
实现的,因为不存在多线程问题,所以没有人报告过这个问题。 - Joshuavfork()
的语义?“如果由vfork()
创建的进程修改除用于存储从vfork()
返回值的pid_t
类型变量之外的任何数据,或从调用vfork()
的函数中返回,或在成功调用_exit(2)
或exec(3)
函数族之一之前调用任何其他函数,则其行为是未定义的。” 如果修改任何内存或调用任何函数都是未定义行为,那么它如何卷土重来呢? - Andrew Henle