Linux cpu-to-cpu 进程间通信

Posted

技术标签:

【中文标题】Linux cpu-to-cpu 进程间通信【英文标题】:Linux cpu-to-cpu inter-process communications 【发布时间】:2016-01-22 19:14:19 【问题描述】:

我编写了一个 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 方法,我将不胜感激。

【问题讨论】:

如果你想为此使用ssh,你应该至少使用ControlMasterControlPersist。但是如果是安全的环境,你可以跳到加密并使用不同的协议(虽然很遗憾我在这里没有任何建议)。 【参考方案1】:

您可以摆脱scp 并将ssh 的输出保存在本地机器上。像这样的:

ssh other-cpu '( my_program command )' > file.log

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

ssh other-cpu > file.log << EOF
my_program command
my_program other_command
EOF

【讨论】:

【参考方案2】:

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


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

您通过pipe(2) 创建一个管道。你做一个fork(2)。孩子将管道的输出文件附加到标准输出。孩子做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”管道的输入文件读取这一行,以 shell 的方式对其进行解析,然后 fork/execs 生成的命令。

遥控器上的子程序终止后,my_program 可以输出一个单独的行。

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

现在,只要本地人想在远程服务器上做某事,管道就已经设置好了。它可以将后续命令写入“to_remote”管道的输出文件并重复该过程。

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

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

如果您的远程目标命令是基于文本的,则分隔符相对容易(即您的程序都不会输出的一些字符串,例如:_jsdfl2_werou_tW__987_)。

如果您有原始二进制数据,my_program 可能必须以某种方式过滤/封装数据(例如,类似于PPP 协议对其flag 字符所做的操作)


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

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

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

您可以在启动时启动远程服务器,也可以使用 [one-time] ssh 调用将其启动到后台。

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

【讨论】:

对不起,但我必须特别感谢 Craig Estey,即使感谢是禁止的。我对答案及其为我指明的方向感到非常满意。 不客气。在评论中表示感谢是 [技术上] 禁止使用的,但它一直都在这样做。表达感谢的另一种方式是支持答案和/或“接受”答案为正确/最佳答案。这些为回答者提供了“声誉积分”。这是鼓励 SO/stackexchange [和我,在这里,特别是--无耻的插件;-)]

以上是关于Linux cpu-to-cpu 进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程间通信

Linux进程间通信——管道

[ Linux ] 进程间通信介绍 管道

Linux 进程间通信-管道

Linux 进程间通信(IPC)

Linux之进程间通信