C++クロスプラットフォーム開発-パラメータシグナルを使用したプロセス間のデータ転送

1.実装要件

第二に、アイデアの実現

大まかな構造:

 シグナルバインディング機能(トリガー機能)は以下のとおりです。

A \ B \ C \ Dの4つのプロセス間の関係が親子関係であることを確認します:AフォークB、BフォークC、CフォークD(またはAは父親、BCDはAの子;または主な機能は父親であり、ABCDは兄弟もできます)

このとき、DはAの曾孫です。BとCには父親と子供がいます。Aには子供がいますが父親はありません。Dには父親がいますが子供はありません。では、BとCをどのように区別しますか?トリガー機能にはnum(受信信号番号)があるため、BとCで受信する信号が異なり、numで判断できます(numが10の場合は、信号SIGUSER1がBプロセスであると判断します。num Cプロセスであると判断するのは12です。numが12に等しいかどうかを直接判断しないように注意してください。これは、CまたはAである可能性があります。

A \ B \ C \ Dの4つのプロセスを区別でき、処理が簡単になります。2つの変数を使用して、4つのプロセスの父または子を格納します。たとえば、Aに子があり、父がいない場合は、子のpidを格納するだけです。BとCには子供がいて、子供を保存する必要があり(送信は子供用であるため)、Dには父親がいて子供がいないため、父親のpidを保存します。次に、達成するためのシグナルバインディング関数を記述します

シグナルをバインドして送信する

  • 信号信号をフォークの前にバインドします(プロセスが開始する前に配置できないことに注意してください。そうしないと、4つのプロセスに4つの信号があります。最初に信号の競合が発生し、信号のシールドが実行されます。次に、より多くのメモリスペースを消費します。つまり、AプロセスはシグナルSIGRTMINなども認識しますが、これは実際には意味がありません)
  • シグナルsigqueueを送信します

古典的なエラー:

子プロセスまたは親プロセスでシグナルを送信します(トリガー関数で直接送信できます)

4回転送されるプロセスは4つあり、4つのトリガー関数が書き込まれると考えられます(関数はすべて受信データ+ 1で次のプロセスに送信され、操作ロジックは同じであり、直接カプセル化できます。シグナルバインディング機能)

3.コード

プロセスAを先に起動し、A起動時にプロセスB、C、Dを次々に起動する必要があります。同期的に実行されていると考えても、ミリ秒単位で一定のギャップがあります。したがって、Aプロセスで遅延(slepp)を実行します。目的は、B、C、Dプロセスを次々に作成して開き、シグナルがすべて正常にバインドされるようにすることです。そうしないと、Aプロセスですぐにシグナルを送信できなくなります(バインドせずに送信され、Bプロセスはまったく受信しません)。

おすすめ

転載: blog.csdn.net/hml111666/article/details/123703324