Linux下使用socat搭建虚拟串口模拟缓冲区溢出问题咨询
问题解答
阻塞根源
你观察到的写入阻塞是Linux内核PTY(虚拟串口)驱动的默认机制导致的,和socat本身无关:
- PTY默认开启流控,当对端的内核读缓冲区被占满后,内核会直接挂起写端的写入系统调用,直到缓冲区腾出可用空间
- Socat仅负责透传两个PTY之间的数据流,没有额外添加阻塞逻辑
实现缓冲区溢出丢包的方案
调整socat启动参数,给PTY设备关闭流控、禁用默认阻塞逻辑即可,修改后的命令如下:
socat -d -d pty,raw,echo=0,noflowctl,nonblock pty,raw,echo=0,noflowctl,nonblock
新增参数说明:
noflowctl:关闭PTY的RTS/CTS硬件流控,避免缓冲区满时内核发送流控信号阻断写入操作nonblock:将PTY设备设置为非阻塞模式,写入时如果缓冲区已满会直接丢弃新数据,不会阻塞写入进程
如果需要自定义缓冲区大小来测试溢出临界点,可以额外新增sendbuf=<字节数>、recvbuf=<字节数>参数调整单个PTY的收发缓冲区上限。
内容的提问来源于stack exchange,提问作者Garrit Strenge
相关产品推荐
相关产品推荐

