2016-10-23 5 views

答えて

1

によって書かれたパイプ、。

sigaction()を使用してハンドラをインストールする場合は、SA_SIGINFOフラグを使用して、次のシグネチャが有効になります(標準信号はキューに入れられないため、ほぼ同時に2つの信号が送信されます)。信号はsigqueue()を使用して送信されると、ハンドラは

void signal_handler(int signum, siginfo_t *info, void *context) 

、3番目のパラメータはタイプunion sigvalの組合に格納され、ポインタまたはINTです。 (union sigval valueのために、int型はvalue.sival_intで、ポインタがvalue.sival_ptrあるLinuxでは、あなたはvalue.sival_ptr = (void *)(unsigned long)yourval;を使用して、フルlongまたはunsigned longを送ることができます。。)

(Linuxの場合、sizeof (long) == sizeof (void *)ので、あなたは、実際に情報のCHAR_BIT*sizeof (long)ビットを送信することができます。 ハンドラは、sigqueue()を使用して信号が送信されたかどうかを、info->si_code == SI_QUEUEにチェックすることで判断できます。これは、32ビットアーキテクチャでは32、64ビットアーキテクチャでは64です。ペイロードは info->si_valueユニオンで利用可能です。送信者がポインタまたはintを送信したかどうかを知ることはできませんので、事前にそれを知る必要があります。 sigaction()のマニュアルページには、si_codeを含むすべてのフィールドが記載されています。

->si_int,->si_ptrおよび->si_valueを混同しないでください。 siginfo_t構造は、メンバーsi_intおよびsi_value.sival_intが全く同じintを参照し、si_ptrおよびsi_value.sival_ptrが正確に同じptrを参照するように定義されています。下位互換性のためにこれらのフィールドにいくつかの余分な "名前"があります。

高負荷時にリアルタイム信号が失われる可能性があることに注意してください。しかし、我々は通常、サービスデーモンに設定や終了をリロードするように指示するために、HUPまたはTERMのようなシグナルを使用します。同様の管理目的のため、および情報(重要なメッセージとは対照的に)のために、シグナルとそのペイロードを使用することは大丈夫です。

0

信号は、プロセス間で過度のデータを渡すためのものではありません。パイプ、ソケットなどの別のIPCメカニズムを検討してください。

代わりに、それらを併用することもできます。例えば。プロセス間のパイプの両端を共有し、プロセスAで何かを書き込んだ後、プロセスBにシグナルを送ります。プロセスBへのシグナルの配信はパイプからの読み込み準備として扱われ、プロセスBは信号がキューイングされているように、あなたは、リアルタイム信号(SIGRTMAX-0からSIGRTMIN+0)を使用して、あなたは1を見逃すはるかに少ないチャンスを持っているA.

関連する問題