【问题标题】:gethostbyname freezes and uses 100% CPU on Mac OS Xgethostbyname 在 Mac OS X 上冻结并使用 100% CPU
【发布时间】:2010-11-30 19:03:06
【问题描述】:

我有一个程序可以打开几个套接字来监听和发送。我发现了一个非常奇怪的情况,目前仅在 Mac OS X 上,gethostbyname 完全冻结了程序。

首先,我使用线程。其次,只有当我同时运行 两个 的测试程序副本时才会出现问题。

第一个实例创建 4 个发送和 4 个接收套接字,然后它们开始相互发送流量。在我用于消息传递的网络库中,gethostbyname() 在接收端口打开后立即被调用。我发现当我启动第二个测试程序实例时,在打开 3 个接收器后,最后一个就卡在那里了。

我已将问题缩小到对gethostbyname 的调用,它似乎永远不会返回。 (请记住,到目前为止,对gethostbyname 的每次调用都可以正常工作。)此外,当它到达这一点时,测试程序的 CPU 使用率突然跳到 100%,就好像有一个无限循环一样gethostbyname。另外我不能 Ctrl-C 进程,我必须从另一个终端杀死它。

显然这种行为是不可接受的,即使它只发生在启动 8 个发送方/接收方对的极端情况下。 (一次处理 4 个,另一个处理 4 个。)有没有人见过这种情况,我该如何避免?

顺便说一句,唯一测试过的其他平台是 Linux (Ubuntu 10.04),它运行得很好。

【问题讨论】:

  • 这个问题是出现在所有 Mac 上,还是只出现在一台上?如果是后者,那 Mac 可能存在某种网络配置问题。
  • 我只在一台mac上测试过。谢谢你的建议,我会在另一台上试试。
  • 我们可以看看你的代码吗?前几天,我遇到了一个似乎被 read() 无限期阻塞但实际上是其他地方的无限循环的错误。如果 CPU 跳到 100%,听起来你也有一个无限的非阻塞循环。
  • 可能是您在该平台上的名称服务器服务被窃听。如果它在另一个操作系统上工作,表明可能的原因。

标签: macos sockets unix gethostbyname


【解决方案1】:

听起来你可能被这个Oracle Java Bug 刺痛了。我的解决方法是将我的 Mac 的主机名添加到 /etc/hosts

sudo bash -c "echo 127.0.0.1 $HOSTNAME >> /etc/hosts"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2016-08-09
    • 2011-03-13
    • 1970-01-01
    • 2018-07-02
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多