我编写了一个Linux C程序,它运行在嵌入式处理器上,其行为类似于shell - 交互式,提供提示,解析用户命令,执行它们,无限循环或非交互式 - 从调用命令中读取和解析命令。我想在另一个嵌入式处理器上同时运行相同的程序,该处理器可以使用e / net(例如ssh)访问,并将其用于某些命令,因为第二个处理器可以访问第一个处理器没有的某些硬件。我通常需要捕获并处理该远程命令的输出。目前,我在第二个处理器上为每个命令调用程序 - 例如
system ("ssh other-cpu my_program "do this command > /vtmp/out_capt");
system ("scp other-cpu:/vtmp/out_capt .")
这很有效,但速度很慢。有没有更好的方法,也许使用管道?如果有人能指出我选择这种IPC的最好方法,我会很感激。
答案 0 :(得分:0)
您可以摆脱scp
并将ssh的输出保存在本地计算机上。像这样:
ssh other-cpu '( my_program command )' > file.log
或者如果您想运行多个命令:
ssh other-cpu > file.log << EOF
my_program command
my_program other_command
EOF
答案 1 :(得分:0)
有几种方法可以做到这一点,速度和复杂程度各不相同。 [自然:-)],最快需要最多的设置。
(1)您可以用输出管替换两个命令序列。
您可以通过pipe(2)
创建单个管道。你做fork(2)
。孩子将管道的输出filds附加到stdout。孩子做execvp("ssh","remote","my_program","blah")
。父级从管道的输入fildes读取结果。不需要临时文件。
这类似于您当前正在执行的操作,因为您为要执行的每个远程命令执行ssh
,但删除了临时文件和scp
。
(2)您可以修改my_program
以接受来自stdin
的各种命令。我相信你已经在程序的“shell”模式下执行此操作。
您可以通过pipe(2)
创建两个管道。再次,fork
一个孩子。像以前一样将“from_remote”管道的输出filals附加到stdout
。但是,现在,将“to_remote”管道的输入filals附加到stdin
。
在父级中,使用fildes输出“to_remote”管道,发送命令行。远程读取此行[通过“to_remote”管道的输入fildes,以shell的方式解析它,并fork / execs生成的命令。
遥控器上的子程序终止后,my_program可以输出分隔线。
父母像以前一样读取数据,直到看到这个分离线。
现在,只要本地人想在遥控器上做某事,管道就已经设置好了。它可以将后续命令写入“to_remote”管道的输出fildes并重复该过程。
因此,不需要拆卸和娱乐。只需要设置一个ssh
。这类似于使用套接字设置服务器,但我们正在使用ssh
和管道。
如果当地人希望关闭连接,它可以关闭其末端的管道[或发送(例如)“!!! stop”命令]
如果远程目标命令是基于文本的,则分离器相对容易(即,某些字符串,您的程序都不会输出如下:_jsdfl2_werou_tW__987_
)。
如果您有原始二进制数据,my_program可能必须以某种方式过滤/封装数据(例如类似于PPP
协议对其flag
字符的处理)
(3)您可以创建my_program
的版本(例如my_program -server
),其作用类似于侦听套接字的服务器[在shell模式下]。
“协议”类似于上面的情况(2),但可能更容易设置,因为网络套接字本质上是双向的(与 2 {{1}的需要相比上面的调用)。
这里的一个优点是您可以直接通过TCP套接字进行通信,从而绕过加密层的开销。
您可以在启动时启动远程服务器,也可以使用[一次性] pipe(2)
调用将其启动到后台。
还有一个额外的好处。而不是上面的“分隔线”,本地可以为每个命令与服务器建立单独的套接字连接。这仍然比上面慢,但比在每次调用时创建ssh
更快。