![cygwin:如何修复 fork 失败](https://linux22.com/image/1546943/cygwin%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BF%AE%E5%A4%8D%20fork%20%E5%A4%B1%E8%B4%A5.png)
我知道已经有很多关于此问题的信息,但我还没能找到解决方案。也许更了解 cygwin 工作原理的人可以提供帮助。
我使用 cygwin 已经好几个月了,一直没有出现问题,直到星期三。星期三,在做实验时,我意外地eval "exit 1"
立即执行了 .Cygwin,因为打印了 fork 错误,如下所示:
0 [main] -bash 10632 fork: child 11748 - died waiting for dll loading, errno 11
-bash: fork: retry: Resource temporarily unavailable
我现在每次尝试获取我.bash_profile
链接的文件时都会收到这些 fork 错误这里,包括我第一次启动终端时。唯一一个在那个下获取并导致错误的文件是git-completion.bash
,但删除该文件并不能避免source .bash_profile
出现错误。
我重启了电脑,更新了 cygwin,并运行了完整的 rebase,但仍然出现该错误。似乎可能是我运行该命令时意外杀死了不该杀死的东西,但我不知道那是什么。有什么想法吗?
我没有运行任何布洛达。我在 Windows 7 上运行 64 位 cygwin。
答案1
cygwin 上的 fork 故障永远不可能 100% 消除 - 请参阅Cygwin 常见问题解答 - 如何修复 fork 失败?
引用 cygwin 网站:
如何修复 fork() 失败?
不幸的是,Windows 不使用类 UNIX 操作系统中的 fork/exec 进程创建模型,因此 Cygwin 很难实现可靠且正确的 fork(),这可能导致错误消息,例如:
- 无法将 somedll 重新映射到与父级相同的地址
- 无法分配堆
- 等待 dll 加载时死亡
- child -1 – 等待 longjmp 时死亡
- 初始化之前
- 状态访问违规
- 资源暂时不可用
上述错误的潜在解决方案:
- 重新启动尝试(但失败了)使用 fork() 的任何进程。有时 Windows 会设置比平常更不利于 fork() 的进程环境。
- 确保你已经消除(而不仅仅是禁用)BLODA 上的所有软件。
- 如果您的操作系统和 CPU 支持,请从 32 位 Cygwin 切换到 64 位 Cygwin。有了更大的地址空间,fork() 失败的可能性就更小。
- 尝试将环境变量 CYGWIN 设置为“detect_bloda”,这将启用一些额外的调试,这可能会指示出哪些其他软件导致了问题。
根据我的经验,Windows 机器启动和运行的时间越长,发生 fork 失败的可能性就越大,我猜测随着时间的推移,内存碎片化会使 cygwin 更难进行 fork 黑客攻击。
我注意到添加更多 RAM 也有帮助。
通过安排 cygwin 机器的重新启动,我获得了合理的成功。
也就是说,最有效的方法是使用 64 位 cygwin 而不是 32 位,并准备完全替换 cygwin,并慷慨地为您的 cygwin 安装文件夹提供明确的防病毒排除。