9

私はこのプログラムを持っています。これをホストと呼びます。ホストはあらゆる種類の優れた機能を実行しますが、実行中にコマンド ラインから入力を受け入れることができる必要があります。これは、何らかの方法で他のプロセス データを送信してから終了する必要があることを意味します。たとえば、次のことができる必要があります。

./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。

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

4

6 に答える 6

10

Windows を使用している場合は、非表示のウィンドウを使用してメッセージを受信するように伝えますが、./.

その場合、名前付きパイプを使用します。Sun には、役に立つかもしれない名前付きパイプに関するチュートリアルがあります。

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

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

于 2008-08-13T22:49:13.653 に答える
6

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

于 2008-08-13T22:51:30.453 に答える
4

Unix ソケットまたはD-Busを使用することをお勧めします。Unix ソケット プログラミングに慣れていて、少数の操作しか必要としない場合は、ソケットを使用した方が高速になる可能性がありますが、D-Bus を使用すると、使い慣れたオブジェクト指向の方法で機能を実装することに集中しやすくなります。

Beej の Guide to Unix IPC、特にUnix socketsの章を見てください。

于 2008-08-18T08:55:41.417 に答える
1

ここで誰も言っていないのは、「ここからはそこにたどり着けない」ということです。

コマンド ラインは、プログラムが呼び出されたときの状態でのみ使用できます。

fillinthename引数 ...」を呼び出して、fillinthename の実行後に fillinthename と通信する相互に通信するプログラムの 2 つのインスタンスを使用することによってのみ実現できます。

他の回答は、コミュニケーションを達成する方法を示唆しています。

amarokのようなプログラムは、永続的なメッセージの受信者/サーバーの主要な役割、またはワンショットメッセージ送信者のマイナーな役割を果たす必要があるかを知るために、それ自体の別のインスタンスの存在を検出する必要があります。

fillinthename という単語が実際に表示されるように編集しました。

于 2010-06-07T14:47:50.567 に答える
0

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

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

于 2010-08-11T17:32:45.453 に答える
-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 の第一人者ではないので、間違いを犯していないことを願っています。

編集:わかりました、彼は何か他のものを求めていましたが、質問が編集される前はあまり明確ではありませんでした. 私の担当者に飛びつく必要はありません...

于 2008-08-13T22:43:34.367 に答える