cygwin:如何修复 fork 失败

cygwin:如何修复 fork 失败

我知道已经有很多关于此问题的信息,但我还没能找到解决方案。也许更了解 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 安装文件夹提供明确的防病毒排除。

相关内容