問題タブ [capnproto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ でプロセス ベースのソケット サーバーを作成するクロスプラットフォームの方法はありますか?
これは一見単純に見えますが、厄介な詳細と互換性の問題がたくさんあります。Linux で動作するコードがいくつかあります... Windows でも動作しますが、一般的で単純な問題のように思われるため、さまざまな問題が発生しています。最近、非同期が大流行していることは知っていますが、接続ごとにプロセスが必要な正当な理由があります。
シミュレーション プロセスをホストするサーバーを作成しています。そのため、各接続は長時間実行され、CPU を集中的に使用します。しかし、もっと重要なことは、これらのシミュレーター (Ngspice、Xyce) にはグローバルな状態があり、セグメンテーション違反や回復不能なエラーが発生することがあります。したがって、各接続には独自のプロセスがあり、それらが並行して実行/クラッシュし、互いの状態を混乱させないようにすることが不可欠です。
もう 1 つのやや重要な詳細は、プロトコルが Capnp RPC に基づいていることです。Capnp RPC には優れたクロスプラットフォームの非同期 API がありますが、ブロッキング API はありません。だから私がしていることは、新しいプロセスをフォークし、新しいプロセスでCapnpイベントループを開始する独自のブロッキング受け入れループを持つことです。
そこで、単純な受け入れループから始め、Windows をサポートするために大量の ifdef を追加し、次に fork を追加してマルチプロセスにし、SIGCHLD ハンドラーを追加してゾンビ プロセスを回避しようとしました。しかし、Windows には fork がなく、多数のクライアントが同時に切断すると、依然としてゾンビが発生します。
私の現在のコードはここにあります: https://github.com/NyanCAD/SimServer/blob/1ba47205904fe57196498653ece828c572579717/main.cpp
Windows を動作させてゾンビを回避するための ifdef とハック、または既製のマルチプロセス ソケット サーバーまたはそのようなものを作成するための機能を提供するライブラリのいずれかで問題ありません。重要な部分は、新しいプロセスでソケットを受け入れ、生の FD を Capnp イベント ループに渡すことができることです。