在工作中,我们有一个旧的 C 程序,它与霍尼韦尔的工业手持终端一起工作。
该终端有自己的 ssh 客户端来连接到 linux redhat 6.6 服务器。一旦它连接到 linux box(使用某个用户),bash shell 就会启动一个 C 程序,并带有以下参数
export TERM=vt200
stty raw icrnl -echo
$APLI_EXEC/program param1 param2
Run Code Online (Sandbox Code Playgroud)
所以流程就像 => 客户端 ssh --> ssh 服务器-> bash --> c 程序
应用程序(或看起来)运行良好,但有时(每周 1-3-5 次)随机终端停止从服务器接收数据,但应用程序接收来自服务器的输入。就像在 shell 中编写 Ctrl+S 一样。
使用 strace 调试应用程序和 ssh 进程时,我意识到一些奇怪的事情:
应用程序 strace 很好
write(1, "1", 7) = 1
Run Code Online (Sandbox Code Playgroud)
但是 ssh 过程的 strace 不好(我认为..是的,我看到 ioctl 没有 echo 参数,但是...)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
read(3, "\227\316\242\350\261\330)\300e\210\352\367\2VX\24\305\2474\272\371\34\273n{\323p.\211\17H\327"..., 16384) …Run Code Online (Sandbox Code Playgroud)