【问题标题】:Dead-simple POSIX C++ IPC非常简单的 POSIX C++ IPC
【发布时间】:2012-09-30 10:06:50
【问题描述】:

我对 c++ linux-only(可能放宽到 posix-only)IPC 解决方案感兴趣,其行为如下;启动了一个名为“计算器”的程序,并可以收听消息。计算器会有一个循环定期检查消息字符串,然后根据它们的内容进行操作。

另一个名为“send_msg”的程序可以将消息发送到它的 pid(最好是主机名/pid,通过 tcp 或 udp)。

$ calculator &

// awhile later

$ send_msg <calculator pid> show calculations
Calc1: 52% complete
Calc2: 21% complete
$ send_msg <calculator pid> alter Calc2 <numeric parameters>
Ok! I'm restarting my calculations!
$

我非常精通c++,但对网络编程一无所知,也没有兴趣花太多时间学习它。是否有一个易于使用的 c++ 包可以完成上述操作?我宁愿不必选择端口号、文件位置等。

【问题讨论】:

    标签: c++ posix ipc


    【解决方案1】:

    看看 RCF - 它是原生 C++ 并支持 publish/subscribe,这应该会很容易。

    【讨论】:

    • 不幸的是,clang 似乎不喜欢 RCF
    • 确实如此。网站上有一个新版本可以解决这个问题(针对 clang 2.9 进行了测试)。感谢您指出这一点!
    【解决方案2】:

    我认为您要求的设置绝非简单。

    对于后台计算器和前端之间的通信,最好使用 Unix 域套接字或 TCP 套接字(端口号)。因此,例如,您可能会运行:

    calculator -p 3456 &
    

    然后计算器在端口 3456 上监听。然后您的 send_msg 程序可用于使计算器执行操作:

    send_msg -p 3456 show calculations
    

    当计算器接收到消息时,它会根据命令执行操作,将答案发送回套接字上的send_msg 程序,然后将其回显到其标准输出。

    同时,您有一个可能需要多线程的计算器。它还需要能够确定每次计算涉及多少工作,以便能够报告每次计算的进度。您和我都没有指定如何设置计算,但可能是:

    send_msg -p 3456 new calc.file
    

    表示计算器应该开始一个新的计算,从文件calc.file中读取问题。它可能会回响:

    Calc1: ETC = 3:15
    

    通过某种或多或少的狡猾手段,它已确定预计完成时间 (ETC) 为 3 分 15 秒。您可以以类似的方式设置第二个计算。为了处理这个问题,你需要一个控制器线程来监听来自send_msg 的连接。当它被告知要创建一个新作业时,它会启动一个新线程(或进程)来进行计算。计算器中的主线程和实际计算线程之间必须有某种约定的机制。这可能就像每个线程写入其进度和主线程读取的位置一样简单。但是计算线程需要跟踪他们已经完成了多少工作,还有多少工作要做,以及是否需要更改估算值。

    现在,我可能把事情弄得太复杂了,但你显示的界面表明可能需要类似的东西。如果您使用单线程计算器,它必须对您设置的每个计算进行某种循环调度,并定期检查send_msg 程序是否发送了新消息。

    【讨论】:

    • 说得好,因为这一切都需要这么多“东西”,我仍然认为 zeromq 是一个不错的选择。这是一个不平凡的问题。
    【解决方案3】:

    我想您可能会喜欢zeromq(拼写为 0mq)或分叉的crossroadsio,因为它们抽象了很多手持操作,让您可以简单地发布/订阅以及许多其他模式。 0mq 有(有?)一堆从简单的乒乓球开始的例子。

    【讨论】:

    • 0mq 看起来像是朝着正确方向迈出的一步,只是方向看起来是笔直向上的。有什么适合傻瓜的吗?
    猜你喜欢
    • 2011-06-02
    • 2018-04-20
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多