2012-02-08 5 views
4

Cで書かれたLinuxプログラム間の通信をどのように実装しますか?具体的には、次のようにします。Linuxプログラム間の通信

私のプログラムは複数のインスタンスで実行できます。スタートアップ時に、自分のプログラムが既に実行中の他のすべてのインスタンスを検出してから、それらにテキスト文字列を送ることができるはずです。一方、すでに実行中のインスタンスには、新しいインスタンスが開始されたことが通知され、新しいインスタンスにテキスト文字列を送信できるようにする必要があります。

Linuxでこのようなソフトウェア設計を実装するために使用できるAPIを教えてもらえますか? Windowsでは、単純にすべてのウィンドウを列挙し、クラス名を確認して自分のプログラムのすべてのインスタンスを見つけ出し、データを送信するために使用できるシステムにカスタムメッセージを登録することができます。しかし、私はLinuxでこれをどのようにしていますか?

ありがとうございました!

+1

をお勧めします。 ;-) – mpontillo

+1

「簡単に」はOPの「壊れやすい」という言葉だと思います。 :-) –

+1

さて、私はEnumWindows()を使ってクラス名を比較するだけで簡単に(再び!)得ることができると思います。私の耳では名前付きパイプの音がはるかに複雑に聞こえるが、それは確かに趣味の問題だ); – Andreas

答えて

1

私はおそらくnamed pipes

+0

しかし、パイプサーバーとして機能するインスタンスを閉じるとどうなるだろうか?その後、クライアントは残っています! – Andreas

+0

@AndreasFalkenhahnパイプサーバーはありません。名前付きパイプはファイルシステム上の 'fifo'型の実際のディレクトリエントリです(デバイス、ファイル、ディレクトリなどをブロックするのではなく' mkfifo'コマンドです)。そのために、/ var/$ {myapp}/ipcpipeは静的に参照される場所になる可能性があります。 –

+0

すべてのサーバ/クライアントは、パイプを読み取りまたは書き込みで開くことができます。パイプはOSレベルで存在します。 mkfifo –

2

は、あなたは多くのオプションがあります。

  • 名前付きパイプを。
  • メッセージコマンド(msgget、msgsend);
  • TCPソケットの使用。
  • UNIXドメインソケットの使用。
  • DBusまたはActiveMQのような第三者ブローカーを使用する。それは、スタンドアロンのマシン、およびデータの1つのストリームだけのためである場合

は、私はあなたの第三段落で「単に」という言葉の使用を好むオプション番号1