在非阻塞套接字上挂起程序

Hung program on a non-blocking socket

本文关键字:挂起 程序 套接字      更新时间:2023-10-16

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

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

既然这是一个非阻塞接受,程序怎么会挂在那里呢?在功能执行和暂停执行之间,操作条件似乎不会发生显著变化。

我不是网络编程专家,所以请让我知道还有什么其他来源(如果有的话)可以提供追踪这一情况的背景。

编辑:该软件在以下上运行并编译

$ 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在新打开的文件描述上设置O_NONBLOCK文件状态标志。