【问题标题】:Communication between Linux programsLinux程序之间的通信
【发布时间】:2012-03-01 03:31:18
【问题描述】:

我将如何实现用 C 编写的 Linux 程序之间的通信?具体来说,我想要以下内容:

我的程序可以在多个实例中运行。启动时,我希望我的程序检测到我的程序的所有其他实例已经在运行,然后它应该能够向它们发送文本字符串。另一方面,我还希望已经运行的实例能够收到新实例已启动的通知,并且它们还应该能够向新实例发送文本字符串。

有人能指出一些可用于在 Linux 上实现此类软件设计的 API 吗?在 Windows 上,我可以简单地枚举所有窗口,检查它们的类名以找出我的程序的所有实例,然后向系统注册一条自定义消息,我可以使用它向它们发送数据。但是在 Linux 上我该怎么做呢?

感谢任何提示!

【问题讨论】:

  • 我喜欢在你的第三段中使用“简单”这个词。 ;-)
  • 我认为“简单”是 OP 的“脆弱”一词。 :-)
  • 好吧,我认为简单地(再次!)使用 EnumWindows() 并比较类名是尽可能简单的。命名管道的东西在我耳中听起来要复杂得多,但这肯定是品味问题;)

标签: c unix posix ipc


【解决方案1】:

你有很多选择:

  • 命名管道;
  • 消息命令(msgget、msgsend);
  • 使用 TCP 套接字;
  • 使用 UNIX 域套接字;
  • 使用第三方代理,例如 DBus 或 ActiveMQ;

如果是单机,并且只有一个数据流,我会推荐选项 1。

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      我可能会从named pipes开始

      【讨论】:

      • 但是当用户关闭充当管道服务器的实例时会发生什么?那么就只剩下客户了!
      • @AndreasFalkenhahn 没有管道服务器。命名管道是文件系统上fifo 类型的实际目录条目(与块设备、文件、目录等相反;因此mkfifo 命令)。为此,/var/${myapp}/ipcpipe 可以是静态引用的位置。
      • 所有服务器/客户端都可以读写打开管道,管道存在于操作系统级别。您甚至可以使用 mkfifo 独立于程序创建它
      • 好的,所以当进程终止时,命名管道不会被删除。但是他们什么时候被删除呢?系统什么时候重启?
      • @AndreasFalkenhahn - 您可以在最后一个客户端退出时显式删除它们,或者从命令行删除它们,或者它们将在重新启动时自动删除 - 任何适用于您的应用的方法
      【解决方案4】:

      我已经为此目的使用了套接字和多播。这允许在同一 LAN 上的多台计算机之间分配进程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2016-01-18
        • 2013-11-13
        • 2011-10-26
        相关资源
        最近更新 更多