2012-02-08 88 views
4

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

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

有人可以指点我可以用来在Linux上实现这样的软件设计的一些API吗?在Windows上,我可以枚举所有窗口,查看它们的类名以查找我的程序的所有实例,然后使用可用于向其发送数据的系统注册一条自定义消息。但是,我将如何在Linux上执行此操作?

感谢您的任何提示!

+1

我喜欢你的第三段用“简单”的。 ;-) – mpontillo 2012-02-08 16:50:42

+1

我认为“简单”是OP的“脆弱”一词。 :-) – 2012-02-08 17:02:27

+1

嗯,我想简单(再一次!)使用EnumWindows()和比较类名是尽可能简单,因为它可以得到。命名管道听起来在我的耳朵里听起来要复杂得多,但这肯定是一个品味问题;) – Andreas 2012-02-08 17:07:52

回答

1

我可能会用named pipes

+0

但是当用户关闭充当管道服务器的实例时会发生什么?那么只剩下客户了! – Andreas 2012-02-08 16:51:50

+0

@AndreasFalkenhahn没有管道服务器。命名管道是文件系统上的“fifo”类型的实际目录项(与块设备,文件,目录等相对;因此是'mkfifo'命令)。为此,/ var/$ {myapp}/ipcpipe可能是一个静态引用的位置。 – 2012-02-08 16:55:40

+0

所有服务器/客户端都可以在读取或写入时打开管道,管道存在于操作系统级别。您甚至可以使用mkfifo – 2012-02-08 16:57:14

0

我已经使用插座和多播为根本目的。这允许在同一LAN上的多台计算机之间分配进程。

2

你有很多的选择:

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

如果它是一个独立的机器,只有一个数据流,我建议选择1号。