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プロセスはまったく受信しません)。