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
,你应该至少使用ControlMaster
和ControlPersist
。但是如果是安全的环境,你可以跳到加密并使用不同的协议(虽然很遗憾我在这里没有任何建议)。
【参考方案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 进程间通信的主要内容,如果未能解决你的问题,请参考以下文章