Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255788
  • 博文数量: 99
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 246
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-03 18:23
个人简介

qrasvasdf

文章分类

全部博文(99)

文章存档

2016年(1)

2015年(36)

2014年(62)

我的朋友

分类: LINUX

2016-10-30 15:28:11

现象:进程在被远程观察时,会导致进程消息队列满,进一步查看进程堆栈,发现是线程阻塞在printf。

为什么printf会阻塞呢,虽然printf本身是阻塞函数,但通常直接输出到标准输出时不太会阻塞很长时间。
但是如果标准输出被重定向到其他地方,就有可能阻塞。比如重定向到串口、网口、管道等。

重定向到串口的情况:假如输出的过多过快,串口输出的过慢,就会导致阻塞较长时间
到网口的情况:最常见的就是ssh登录、telnet登录,这时输出的当前终端的标准输出都重定向到了ssh、telnet的链路中,如果链路的send阻塞了,标准输出自然也就阻塞了
到管道的情况:管道缓冲区有限,对端读的过慢或不读,本端作为写的一端将缓冲区写满后就会阻塞

本次问题是由于重定向到ssh导致的。
由于使用ssh登录到服务器定位问题,且打开了被定位进程的标准输出,printf就源源不断的通过ssh的链路输出到当前终端。
但是在当前机器一段时间未使用休眠后,ssh终端将不再从TCP协议栈读取数据,导致服务器端的发送缓冲区满,进而导致send阻塞,
然后就是printf阻塞,直到ssh心跳超时断开连接,printf恢复。
阅读(6833) | 评论(0) | 转发(0) |
0

上一篇:如何躲避ifconfig 陷阱

下一篇:没有了

给主人留下些什么吧!~~