Linux cpu-to-cpu进程间通信

时间:2016-01-22 19:14:19

标签: linux ipc

我编写了一个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的最好方法,我会很感激。

2 个答案:

答案 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更快。