【问题标题】:Hung program on a non-blocking socket在非阻塞套接字上挂起程序
【发布时间】:2016-04-20 16:13:03
【问题描述】:

在不一致的时间间隔内,我最近看到一个特定的程序挂起(即停止执行但没有崩溃并且没有旋转 CPU)。当强制使用核心转储终止时,它一直停留在这一行:

int new_socket = accept4(listen_socket,NULL,NULL,SOCK_NONBLOCK);

既然这是一个非阻塞的accept,那程序怎么会挂在那里呢?在功能执行和暂停执行之间,操作条件似乎没有显着变化。

我不是网络编程专家,所以请让我知道还有哪些其他来源(如果有)可以提供跟踪此问题的上下文。

编辑:此软件正在运行并使用以下内容编译

$ uname -a
Linux phoenix 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

$ g++ --version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19

【问题讨论】:

  • 这是用哪种语言,C 还是 C++?
  • 它是非常 C 风格的 C++,但它是用 g++ 编译的,所以就是这样。我对标签很宽泛,因为我认为套接字是……嗯,很宽泛。 =)
  • 啊,很公平。毫无价值,这里的首选规范 afaik 是只使用一个“语言标签”,除了专门关于语言兼容性的问题。不过,还是交给你吧。
  • 这很好。细节修改。不过,似乎@alk 无论如何都提供了答案。测试时间...

标签: c++ c linux sockets unix


【解决方案1】:

SOCK_NONBLOCK 选项不是指监听套接字(传递给accept4() 的那个),而是指在接受连接时创建的那个。

来自man accept4的逐字记录:

SOCK_NONBLOCK 在新打开的文件描述上设置 O_NONBLOCK 文件状态标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多