linux – 选择系统调用在nw应用程序中无限期挂起.

linux – 选择系统调用在nw应用程序中无限期挂起.,第1张

概述我们有一个网络应用程序,它将在各种脚本中用于与其他系统进行通信. 有时,脚本会挂起对我们网络应用程序的调用.我们最近遇到了挂起,我试图调试这个特定应用程序的挂起过程. 此应用程序由客户端和服务器(守护程序)组成,挂起发生在客户端. Strace输出显示它挂在选择系统调用上. > strace -p 34567select(4, [3], NULL, NULL, NULL 正如您所看到的,在sel 我们有一个网络应用程序,它将在各种脚本中用于与其他系统进行通信.

有时,脚本会挂起对我们网络应用程序的调用.我们最近遇到了挂起,我试图调试这个特定应用程序的挂起过程.

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

Strace输出显示它挂在选择系统调用上.

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

正如您所看到的,在select调用中没有给出超时,如果文件描述符“3”未准备好读取,它可以无限期地阻塞.

lsof输出显示fd’3’处于FIN_WAIT2状态.

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

以上信息是否意味着什么? FIN_WAIT2状态?我检查了服务器端(应该运行相应的守护程序进程),但是服务器端没有运行守护程序进程.我的猜测是守护进程成功运行并将输出发送到客户端,这应该在fd’3’上可用于读取,但客户端上的select()调用永远不会出现,仍然等待发生的事情!

我不确定为什么它永远不会出现select()调用,这只会偶尔发生,大多数情况下应用程序才能正常工作.

有线索吗?

服务器和客户端都是SuSE linux.

解决方法 FIN_WAIT2表示您的应用程序已向对等方发送了FIN数据包,但尚未从对等方收到FIN.在TCP中,优雅的关闭需要来自双方的FIN.服务器守护程序未运行的事实意味着守护程序退出(或被杀死)而不通知其对等方(您).所以你的select()正在等待它将不再接收的数据包,并且必须等待 *** 作系统使用内部超时使套接字无效,这可能需要很长时间.这是为什么你永远不应该使用无限超时的情况.如果超时,则使用适当的超时并相应地执行 *** 作. 总结

以上是内存溢出为你收集整理的linux – 选择系统调用在n / w应用程序中无限期挂起.全部内容,希望文章能够帮你解决linux – 选择系统调用在n / w应用程序中无限期挂起.所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1018943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存