小さなウェブサーバーを書いて、いくつかのCコードをいじっています。私がやっていることの目的は、さまざまなネットワーク技術を使用してサーバーを作成し、それらについてもっと学ぶことができるようにすることです (マルチスレッド、マルチプロセス、選択、ポーリング)。コードの大部分は同じままですが、ネットワーク コードを「交換」して、さまざまな手法に対するパフォーマンス テストを実行できるようにしたいと考えています。ifdefs を使用することを考えましたが、コードがすぐに醜くなるようです。助言がありますか?
4 に答える
動的ライブラリのロード? たとえばdlopen
Linux の場合。
動的ロードが必要なコンポーネントに共通の API を作成するだけです。
私は、C/C++ ソースから makefile に「条件付きコンパイル」をプッシュすることを好みます。つまり、複数の .c/.cpp ファイルから同じシンボルを生成しますが、ビルド オプションで選択されたオブジェクトのみをリンクします。
また、nginxをまだご覧になっていない場合は、こちらもご覧ください。Web サーバーの実装に関するアイデアが得られるかもしれません。
ネットワーク関連の機能のさまざまな実装を、共通のヘッダーを共有するさまざまな .c ファイルに配置し、使用するヘッダーとリンクします。これから始めて、実行したさまざまな実装ごとに、この方法で makefile に x 個の異なる実行可能ファイルを作成させることができるので、「make httpd_select」または「make httpd_poll」などと言うことができます。
特に、最適なアプローチを見つけるためのベンチマークでは、実行時に余分なオーバーヘッドが発生する可能性があるため、共有ライブラリや関数ポインターを使用するよりも、コンパイラー/リンカー レベルで実行する方が信頼性の高い結果が得られる可能性があります。
柔軟なインターフェイスを備えた独自のライブラリにネットワーク部分をコンパイルします。その lib を必要に応じてさまざまなラッパーにコンパイルします。要件を満たす既存のライブラリを見つけることさえできるかもしれません。