【发布时间】:2014-02-26 01:38:54
【问题描述】:
我们有一个网络应用程序,它将在各种脚本中用于与其他系统进行通信。
有时脚本会在调用我们的网络应用程序时挂起。我们最近遇到了挂起,我尝试调试这个特定应用程序的挂起进程。
这个应用程序由一个客户端和一个服务器(一个守护进程)组成,挂起发生在客户端。
Strace 输出显示它已挂在 select 系统调用上。
> strace -p 34567
select(4, [3], NULL, NULL, NULL
如您所见,选择调用没有超时,如果文件描述符“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() 调用中,这只是偶尔发生,大多数时候应用程序都可以正常工作。
有什么线索吗?
服务器和客户端都是 SuSE Linux。
【问题讨论】:
标签: linux sockets network-programming