我会尽量保持清醒(抱歉给您带来任何不便)
在工作中我们有一个旧的C程序,它与霍尼韦尔的工业手持终端配合使用。
该终端有自己的ssh客户端连接到linux redhat 6.6服务器。 一旦它连接到linux盒子(使用某个用户),bash shell就会用以下参数启动一个C程序
export TERM=vt200
stty raw icrnl -echo
$APLI_EXEC/program param1 param2
所以流程就像=>客户端ssh - > ssh服务器 - > bash - > c程序
应用程序(或似乎)工作正常但有时(每周1-3-5次)随机终端停止从服务器接收数据但应用程序从其接收输入。就像你在shell中编写Ctrl + S一样
使用strace来解决应用程序和ssh进程我意识到了一些奇怪的事情:
app strace很好
write(1, "1", 7) = 1
但是ssh过程的结果并不好(我想..是的,我看到ioctl没有回声参数,但是......)
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) = 48
select(14, [3 9], [11], NULL, {900, 0}) = 1 (out [11], left {899, 999996})
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
write(11, "1", 1) = 1
ioctl(11, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 -opost -isig -icanon -echo ...}) = 0
select(14, [3 9], [], NULL, {900, 0} <<<<
ssh进程使用的文件描述符:
lr-x------ 1 root root 64 Feb 15 17:12 9 -> pipe:[383586491]
lr-x------ 1 root root 64 Feb 15 17:12 8 -> /var/lib/sss/mc/group
lrwx------ 1 root root 64 Feb 15 17:12 7 -> socket:[383586484]
lrwx------ 1 root root 64 Feb 15 17:12 6 -> socket:[383586478]
lrwx------ 1 root root 64 Feb 15 17:12 5 -> socket:[383586458]
lrwx------ 1 root root 64 Feb 15 17:12 4 -> socket:[383586457]
lrwx------ 1 root root 64 Feb 15 17:12 3 -> socket:[383585929]
lrwx------ 1 root root 64 Feb 15 17:12 2 -> /dev/null
lrwx------ 1 root root 64 Feb 15 17:12 14 -> /dev/ptmx
lrwx------ 1 root root 64 Feb 15 17:12 13 -> /dev/ptmx
lrwx------ 1 root root 64 Feb 15 17:12 11 -> /dev/ptmx
l-wx------ 1 root root 64 Feb 15 17:12 10 -> pipe:[383586491]
lrwx------ 1 root root 64 Feb 15 17:12 1 -> /dev/null
lrwx------ 1 root root 64 Feb 15 17:12 0 -> /dev/null
在选择通话中,我想念fd#11或fd#13
将此与另一个电话进行比较
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
read(3, "\365\354\354C\10|\336-\4\342\327B0P\275&\213)\367\32\24\333)#\364\355V\3\237\337\33\204"..., 16384) = 52
select(14, [3 9 13], [11], NULL, {900, 0}) = 1 (out [11], left {899, 999997})
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
write(11, "a", 1) = 1
ioctl(11, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
select(14, [3 9 13], [], NULL, {900, 0} <<<
另一个电话中fd#13的情况如何?
C程序是否可以执行某些操作来锁定ssh的文件描述符?我不这么认为,因为ssh进程由root拥有,而C程序由普通用户运行,但是谁知道
手持终端可以发送他们挂起的ctrl键的组合&#39;标准输出?
我的想法用完了......任何人都可以把我推向正确的方向吗?
提前致谢
纳乔。