【发布时间】:2020-05-01 14:36:03
【问题描述】:
在我的 glibc 2.13 版本中似乎存在一个错误,它使重复调用 fork()/execv() 很危险,从而导致崩溃和内存损坏。这似乎发生在大约 1-2% 的时间里。目前的代码流程如下
- 父进程分叉子进程
- child 关闭所有继承的文件描述符,stdin、stdout、stderr 除外
- child 运行 setgid 和 setuid 以不再以 root 身份运行
- 应运行的 Execv 二进制文件
如果我只使用 posix_spawn() 替换上述 4 个步骤,我的程序永远不会崩溃。这似乎验证了我的假设,即我当前的 glibc 在 fork/execv 中存在错误。
将步骤 1-4 替换为 posix_spawn() 的问题在于,它没有为我提供完成步骤 2 和 3 的机制,这对于资源管理和安全性极为重要。是否有任何替代解决方案或我没有考虑过的东西以使稳定版本正常工作?
【问题讨论】:
标签: fork posix glibc spawn execv