gpt4 book ai didi

linux - 选择系统调用在 n/w 应用程序中无限期挂起。

转载 作者:IT王子 更新时间:2023-10-29 01:15:08 26 4
gpt4 key购买 nike

我们有一个网络应用程序,它将在各种脚本中使用以与其他系统通信。

有时,脚本会在调用我们的网络应用程序时挂起。我们最近遇到了挂起,我尝试调试这个特定应用程序的挂起进程。

此应用程序由客户端和服务器(守护进程)组成,挂起发生在客户端。

Strace 输出显示它卡在一个选择的系统调用上。

> strace -p 34567
select(4, [3], NULL, NULL, NULL

如您所见,select 调用没有超时,如果文件描述符“3”未准备好读取,它会无限期阻塞。

lsof 输出显示 fd '3' 处于 FIN_WAIT2 状态。

> lsof -p 34567
client 34567 user 3u IPv4 55184032 TCP client-box:smar-se-port2->server:daemon (FIN_WAIT2)

以上信息是否暗示了什么? FIN_WAIT2 状态?我检查了服务器端(应该运行相应的守护进程),但是服务器端没有运行守护进程。我的猜测是守护进程成功运行并将输出发送到客户端,它应该在 fd '3' 上可用以供读取,但是客户端上的 select() 调用永远不会出现,并且仍在等待某些事情发生!

我不确定为什么它永远不会从 select() 调用中出现,这只是偶尔发生,大多数时候应用程序运行良好。

有什么线索吗?

Server和client都是SuSE Linux。

最佳答案

FIN_WAIT2 表示您的应用已向对等方发送了一个FIN 数据包,但尚未从对等方收到FIN。在 TCP 中,正常关闭需要双方的 FIN。服务器守护进程未运行的事实意味着守护进程退出(或被杀死)而没有通知其对等方(您)。所以您的 select() 正在等待它不再接收的数据包,并且必须等待操作系统使用内部超时使套接字无效,这可能需要很长时间。在这种情况下,您应该永远不要使用无限超时。使用适当的超时并在超时结束时采取相应措施。

关于linux - 选择系统调用在 n/w 应用程序中无限期挂起。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21512613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com