c++ - 非阻塞套接字上的挂起程序

标签 c++ c linux sockets unix

最近,我发现一个特定的程序在不一致的时间间隔内挂起(即停止执行,但没有崩溃,也没有使 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/

相关文章:

linux - 如何在打包、签名、混淆机制方面比较两个 tar 文件?

c++ - 连分数

c++ - 圆柱算法

c++ - 一次窃取 std::array 而不是逐个元素

c++ - 带有 phreads 的程序可以工作一段时间然后停止

c++ - 文件何时加载到内存中 - 用于 fread、fopen 和 fwrite 调用?

c++ - 将无符号短裤数组转换为无符号字符数组

linux - 通过 emacs 插入几行作为一个巨大文件的头部?

linux - 只有变量的 Bash 函数

c - 为什么在分配最大单点浮点值时出现错误 "integer literal is too large to be represented in any integer type"?