2008-08-13 16 views
8

私はこのプログラムを持っています。私たちはそれをホストと呼んでいます。ホストはあらゆる種類の良いことをしますが、を実行している間はコマンドラインで入力を受け入れる必要があります。つまり、何とか他のプロセスデータを送信してから終了する必要があります。例えば、私はこれを行うことができるようにする必要があります。これは何とかホストにいくつかの関数を呼び出すに終わるはずですコマンドラインでプログラムにメッセージを送信

./Host --blahblah 3 6 3 5 

handleBlahBlah(int x1, int y1, int x2, int y2){ 
    //do some more sweet stuff 
} 

ホストがCのプログラムであり、複数のサポートする必要がないと呼ばれますインスタンス。

この例はAmarokの音楽プレーヤーです。 Amarokを実行して再生すると、 "amarok --pause"と入力すると音楽が一時停止します。

LinuxまたはWindowsでこれを行う必要があります。好ましくはLinux。

これを実装する最もクリーンな方法は何ですか?

+0

プログラムがすでに実行されているときに引数を渡したいですか? これはどのOS用にプログラムされていますか? –

答えて

-2

私はここでそのポイントを見逃しているかもしれませんが、Cのプログラムのmain関数は2つの引数を取っています。 argc、引数の数のカウント(少なくとも1つ)、argv(またはargベクトル)の引数リスト。あなたは引数を解析し、正しいメソッドを呼び出すことができます。 例:

int main(int argc, *argv[]) 
{ 
    /*loop through each argument and take action*/ 
     while (--argc > 0) 
     { 
      printf(%s%s, *++argv, (argc > 1) ? " " : ""); 
     } 
} 

すべての引数を画面に出力します。私はCの達人ではないので、私は間違いがないことを願っています。

編集:OK、彼は何かの後だったが、質問が編集される前に本当に明確ではなかった。私の担当者に飛び乗る必要はありません...

8

Windowsの場合は、メッセージを受け取るために隠しウィンドウを使用するように指示しますが、./を使用して以来、ベース。

その場合は、named pipeとします。 Sunは便利な名前付きパイプに関するtutorialを持っています。

プログラムはおそらくパイプを作成して聞きます。別のコマンドラインスクリプトを使用すると、パイプを開き、そのコマンドライン引数をエコーし​​ます。

別のスクリプトを使用する代わりにコマンドライン送信をサポートするようにプログラムを修正してください。あなたはその場合同じ基本的なことをします。あなたのプログラムはコマンドライン引数を調べ、該当する場合はプログラムの「メイン」インスタンスへのパイプを開き、引数を送信します。

+1

+1私はこの名前付きパイプ方法論を何度か使ってきました。また、メインプログラムがコマンドラインスクリプト/プログラムにデータを返す必要がある場合に、UNIXソケットを使用しました。 – jschmier

5

クロスプラットフォームである必要がある場合は、実行中のインスタンスをTCPポートでリッスンし、コマンドラインから起動したインスタンスでそのポートにメッセージを送信することを検討するとよいでしょう。

4

Unix socketまたはD-Busのいずれかを使用することをお勧めします。 Unixソケットプログラミングに慣れていてほんの数の操作しか必要としないのであれば、D-Busは使い慣れたオブジェクト指向の方法で機能を実装することに集中する方が簡単な場合は、ソケットを使用するほうが速いかもしれません。

Beej's Guide to Unix IPC、特にUnix socketsの章をご覧ください。

1

ここに誰も言わなかったのは "ここからは到着できません"。

コマンドラインは、プログラムの起動時と同じように使用できます。

呼び出しの例「fillinthename引数...」fillinthename回fillinthenameと通信するために実行されているだけ互いに通信プログラムの2つのインスタンスを使用することによって達成することができます。

その他の回答は、コミュニケーションを実現する方法を示唆しています。プログラムのような

のamarokは、それがプレーしなければならない役割を知るために 永続的なメッセージ受信/サーバー、または1つのショットのマイナーな役割の主要な役割を自身の別のインスタンス の存在を検出する必要がある メッセージ送信者。

実際に表示される単語を埋め込むように編集されています。

0

私が見た1つのテクニックは、Hostプログラムをあなたの実際のプログラムの単なるシェルにすることです。たとえば、アプリケーションを正常に起動すると(例:./Host)、プログラムはコードの「メインアプリケーション」部分に分岐します。実行中のインスタンス(例:./Host --send-message restart)を通知するようにプログラムを起動すると、プログラムはコードの「メッセージ送信者」部分に分岐します。 1つに2つのアプリを持つようなものです。 forkを使用しない別の方法は、Hostを「メッセージ送信者」アプリにして、「メインアプリ」をHostが別々に起動できる個別の実行可能ファイル(例:Host_core)にすることです。

プログラムの「メインアプリケーション」部分は、メッセージを受信するために何らかの種類の通信チャネルを開く必要があり、「メッセージ送信者」の部分はそのチャネルに接続してメッセージを送信する必要があります。プロセス間でメッセージを送信するには、いくつかの異なるオプションがあります。より一般的な方法のいくつかはpipessocketsです。お使いのOSによっては、追加のオプションが用意されている場合があります。例えば、QNXはchannelsであり、BeOS/HaikuはBMessagesである。 lcmのように、この機能をきちんとまとめたライブラリを見つけることもできます。

関連する問題