最近,我发现一个特定的程序在不一致的时间间隔内挂起(即停止执行,但没有崩溃,也没有使 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
最佳答案
选项SOCK_NONBLOCK
并不是指监听套接字(传递给accept4()
的套接字),而是指在接受连接时创建的套接字。
逐字记录 man accept4
:
SOCK_NONBLOCK Set the O_NONBLOCK file status flag on the new open file description.
关于c++ - 非阻塞套接字上的挂起程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36749541/