首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux cpu-to-cpu进程间通信

Linux cpu-to-cpu进程间通信
EN

Stack Overflow用户
提问于 2016-01-23 03:14:19
回答 2查看 339关注 0票数 2

我已经编写了一个Linux C程序,它在嵌入式处理器上运行,它的行为就像一个shell --交互地,给出提示,解析用户命令,并在无限循环中执行它们,或者非交互地-读取和解析调用命令中的命令。我想在另一个嵌入式处理器上同时运行相同的程序,该处理器可以使用e/net (例如ssh)访问,并将其用于某些命令,因为第二个处理器可以访问第一个处理器不能访问的一些硬件。我通常需要捕获和处理该远程命令的输出。目前,我为每个命令调用第二个处理器上的程序--例如

代码语言:javascript
复制
system ("ssh other-cpu my_program "do this command > /vtmp/out_capt");
system ("scp other-cpu:/vtmp/out_capt .")

这是可行的,但速度很慢。有没有更好的方法,比如使用管道?如果有人能给我推荐一种做这种IPC的最佳方法,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2016-01-25 06:45:43

您可以去掉scp,只需将ssh的输出保存在本地计算机上。如下所示:

代码语言:javascript
复制
ssh other-cpu '( my_program command )' > file.log

或者,如果您想运行多个命令:

代码语言:javascript
复制
ssh other-cpu > file.log << EOF
my_program command
my_program other_command
EOF
票数 0
EN

Stack Overflow用户

发布于 2016-01-25 12:14:40

有几种方法可以做到这一点,但速度和复杂性各不相同。自然:-),最快的需要最多的设置。

(1)您可以用输出管道替换您的两个命令序列。

您可以通过pipe(2)创建单个管道。你做一个fork(2)。子节点将管道的输出文件附加到stdout。这个孩子做execvp("ssh","remote","my_program","blah")。父级从管道的输入文件中读取结果。不需要临时文件。

这类似于您当前正在做的事情,即为您想要执行的每个远程命令执行一个ssh,但去掉了临时文件和scp

(2)您可以修改my_program以接受来自stdin的各种命令。我相信你已经在程序的"shell“模式中做到了这一点。

您可以通过pipe(2)创建两个管道。再说一次,fork是一个孩子。像以前一样将"from_remote“管道的输出文件附加到stdout。但是,现在将"to_remote“管道的输入文件附加到stdin

在父目录中,使用文件输出"to_remote“管道,发送一个命令行。遥控器读取此行[通过"to_remote“管道的输入文件,以外壳的方式解析它,并派生/执行结果命令。

在遥控器上的子程序终止后,my_program可以输出一个分隔线。

父级像以前一样读取数据,直到它看到这条分隔线。

现在,只要本地用户想要在遥控器上做点什么,管道就已经设置好了。它只需将后续命令写入"to_remote“管道的输出文件,然后重复该过程。

因此,不需要拆卸和娱乐。只需要设置一个ssh。这类似于使用套接字设置服务器,但我们使用的是ssh和管道。

如果本地希望关闭连接,它可以关闭管道的一端或发送(例如)“!stop”命令

如果你的远程目标命令是基于文本的,那么分隔符是相对简单的(例如,一些你的程序永远不会输出的字符串:_jsdfl2_werou_tW__987_)。

如果你已经得到了原始的二进制数据,my_program可能不得不以某种方式过滤/封装数据(例如,类似于PPP协议对其flag字符的操作)

(3)您可以创建一个版本的my_program (例如my_program -server),它的作用类似于在外壳模式下监听套接字的服务器。

“协议”类似于上面的情况(2),但可能更容易设置,因为网络套接字本质上是双向的(而不是需要上面的两个pipe(2)调用)。

这里的一个优点是,您可以直接通过TCP套接字进行通信,从而绕过加密层的开销。

您可以在引导时启动远程服务器,也可以使用一次性的ssh调用将其踢到后台。

还有一个额外的优势。而不是上面的“分隔线”,本地可以为每个命令建立到服务器的单独套接字连接。这仍然比上面慢,但比在每次调用时创建ssh要快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34982176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档