Linuxの待機信号(sigsuspend)

/ * Sigsuspend()関数の説明* /

書式#include <stdio.hに> 
する#include <signal.hに>

/ *
知識は加えました:
    sigsuspend()関数

    プロトタイプ:
    書式#include <signal.hに>
    int型sigsuspend(のconst sigset_t *マスク)。

    パラメータ:
    所望のマスク信号を@mask

    戻り値:
    Sigsuspendは、呼び出しの前にシグナルマスクを復元するために戻ります。信号処理機能が完了すると、プロセスが続行されます。システムコールは常に-1を返しますEINTRにerrnoをセットで。

    備考:
    sigsuspendへの実装のプロセスは、sigsuspendおよびプロセスTASK_INTERRUPTIBLE状態で、すぐに戻り、すぐにCPUをあきらめない場合には、
    (マスク外)ブロックを解除する待機ウェイクアップ信号。信号の組を減少関数呼び出しを処理する工程UNBLOCK(マスク外)信号を受信し、以降、
    sigsuspendリターンは、プロセスが実行を再開します。

    使用シナリオ:
    sigsuspend()関数は、選択された信号をブロックすることができ、又はそれらのブロックを解除するために単語を遮蔽信号の処理を変更します。
    この技術を使用すると、コードの信号クリティカルセクションを中断したくない保護することができます。
    あなたは信号のブロックを解除したい場合は、発生した、あなたはsigsuspend()関数を使用する必要があり、以前にブロックされたシグナルを待って一時停止
    ポーズ()関数は、上記目的を達成することができません

    //。ブロッキング信号
    (のsigprocmask(SIG_BLOCK、&newmask&oldmask)<0)の場合
        err_sys( "SIG_BLOCKエラー");

    // B。ブロックを解除
    (のsigprocmask(SIG_SETMASK、&oldmask、NULL)<0)の場合
        err_sys( "SIG_SETMASKエラー");

    // C。シグナルを待ちます
    ポーズ();    

    注:あなたは、信号の位相を待つ場合は、プログラムに信号を送り、その後、()関数が終了を一時停止し、信号処理
        ブロック解除する送信信号が前場合、信号が解除され、信号処理機能を実行は、実行バックポーズ()関数を完了した後、プログラムがスタックされるとすぐに実行しました

        この問題を解決するには、信号アトミック操作マスク文字、そして睡眠のプロセスを回復する必要があります。この関数は、()関数が提供されるsigsuspendによって行われます。

* /

テスト()
{
    sigset_t セット;

    @ 1セット信号処理される 
    (&sigemptysetをSET )。
    sigaddset( SET 、SIGCHLD),;
    sigaddset( SET 、SIGALRM),;
    sigaddset( セットは、SIGIO)。
    sigaddset( セット、SIGINT)。

    // 前記第1マスク信号
    IF(は、sigprocmask(SIG_BLOCK、&SET - 、NULL)== 1 
    {
        printf(" は、sigprocmask()が失敗しました\ nは。" );
        リターン;
    }

    // 3.いくつかの初期化を行います

    // 4信号を受信し始める 
    sigemptyset(&SETを);     // クリア信号セット

    sigsuspend( SET);     // 待機信号は、オーバー処理

}

int型のmain()
{
    テスト();
    printf(" ----- OK ------- \ N " );
    リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/zhanggaofeng/p/12050961.html