我的glibc 2.13版本中似乎存在一个错误,使得重复调用fork()/ execv()十分危险,从而导致崩溃和内存损坏。这似乎发生大约1-2%的时间。当前代码流如下
如果仅使用posix_spawn()替换上述4个步骤,则程序永不崩溃。这似乎证实了我的假设,即我当前的glibc中的fork / execv有一个错误。
用posix_spawn()替换第1-4步的问题是,它没有为我提供完成第2步和第3步的机制,这对资源管理和安全性至关重要。是否有任何其他解决方案或我为了使稳定版本能够正常工作而未考虑的事项?
glibc 2.13在fork
的实现中使用execve
和posix_spawn
。这可能是您代码中的另一个错误。仅在glibc 2.24和更高版本中,posix_spawn
默认避免使用fork
(这意味着根本不运行fork
处理程序,并且这些处理程序可能导致崩溃或挂起)。用posix_spawn()替换第1-4步的问题是,它没有为我提供完成第2步和第3步的机制,这对资源管理和安全性至关重要。有没有其他解决方案
唯一的方法是引入一个包装程序,该程序关闭所有文件描述符,切换ID,然后启动实际的目标程序。