6

私はいじくり回して、C で小さな IRC フレームワークを書いていましたが、それをいくつかのコア機能で拡張しようとしています。

これまで、私が IRC 関連の何かを書き (そして、今では約 6 つの異なる言語で多くのことを書きました... 私は燃えています!)、実際にプラグイン アーキテクチャの実装に進むときはいつでも、それはインタプリタ言語の内部にありました。たとえば、Ruby でスクリプト ファイル全体を妨害するeval(悪い!) などです。

今、私はCで何かを悪用したい!

基本的に私ができることは3つあります

  1. プログラム内で単純なスクリプト言語を定義する
  2. 既存のものを使用し、インタープリターを埋め込む
  3. libdl を使用して、実行時に *.so モジュールをロードします

私は 3 番目のオプションが好きで、できれば他の 2 つのオプションは避けたいと思っています。私はある種のマゾヒストかもしれませんが、楽しくて学習にも役立つと思います。

論理的に考えると、明らかな「痛みの連鎖」は (最低から​​最高へ) 2 -> 1 -> 3 になります。これは単純な理由で、libdl は私の目の前で頻繁に爆発する (そして爆発する) 生のコードを扱っているためです。 .

この質問は、stackoverflow の仲間のユーザーであるあなたに向けられています。libdl はこのタスクを実行できると思いますか、それとも現実的な考えでさえありますか?

4

3 に答える 3

3

dlopen()/dlsym()はおそらく最も簡単な方法です。いくつかのばかげた疑似コード:

int run_module(const char *path, char **args)
{
   void *module;
   void (*initfunc)(char **agrs);
   int rc = 0;

   module = dlopen(path, RTLD_NOW);
   if (module == NULL)
      err_out("Could not open module %s", path);

   initfunc = dlsym(module, "module_init");
   if (initfunc == NULL) {
      dlclose(module);
      err_out("Could not find symbol init_func in %s", path);
   }

   rc = initfunc(args);

   dlclose(module);

   return rc;
}

もちろん、エラーチェックの方法や、実際に何か便利なことをしたコードがもっと必要になります:)ただし、ペアの周りにプラグインアーキテクチャを記述し、簡単な仕様を公開するのは非常に簡単で便利です。他の人が同じことをするために。

おそらく、の線に沿ってもっと何かが必要になるでしょうload_module()。上記はSOをロードし、エントリポイントを探し、そのエントリポイントが終了するまでブロックします。

独自のスクリプト言語を書くことが悪い考えだと言っているわけではありません。人々は、多くの問題を経験することなく、複雑なフィルターやレスポンダーなどを書くことができました。おそらく両方とも良い考えでしょう。本格的なLUAインタプリタが必要かどうかはわかりませんが、正規表現に基づいたアクションを簡単に実行できるものを考え出すことができるかもしれません。

それでも、プラグインモジュールはあなたの生活をシンプルにするだけでなく、あなたが作ったものを中心に何かを開発する人々のコミュニティを成長させるのに役立ちます。

于 2010-05-21T14:38:42.817 に答える
3

libdlプラグイン アーキテクチャに非常に適しています - 特定の境界内で:-)。多くの異なるソフトウェアで、まさにこの種の目的で使用されています。これは、メイン プログラムとプラグインの間に明確に定義された API/インターフェースがあり、多くの異なるプラグインが同じ API/インターフェースを実装している状況でうまく機能します。たとえば、IRC クライアントには、さまざまな IM プロトコル (Jabber、MSN、Sametime など) へのゲートウェイを実装するプラグインがある場合があります。これらはすべて非常に似ているため、「メッセージを送信する」などの関数を使用して API を定義できます。 "、"応答の確認" など - そして、それぞれが異なるプロトコルの 1 つを実装する一連のプラグインを作成します。

うまく機能しない状況は、プラグインにメイン プログラムの動作を任意に変更させたい場合です。たとえば、Firefox プラグインがブラウザ タブの動作や外観を変更できるようにします。 、ボタンの追加/削除など。この種のことは、動的言語で実現するのがはるかに簡単です (したがって、Firefox の多くが JavaScript で実装されている理由です)。これが必要な種類のカスタマイズである場合は、オプション (2) を使用して、スクリプト言語での UI の多く...

于 2010-05-21T14:19:46.277 に答える
1

dlopen()/dlsym()を使用してプラグイン アーキテクチャ (複数の IRC 関連のものを含む) を実装する既存の C プログラムはたくさんあります。そうです、それは間違いなく仕事次第です。

于 2010-05-21T14:13:59.397 に答える