2012-02-08 49 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號。