LinuxCシグナルの一時停止とsigsuspendの同じ違い



Same Difference Between Linux C Signal Pause



順番 https://www.cnblogs.com/mrethan/p/5612839.html

  • 一時停止機能:

機能:信号が表示されるまでプロセスを一時停止します



#include

intpause()



関数の説明:pause()は、シグナルが中断されるまで、現在のプロセスを一時停止(スリープ状態)にします。

戻り値:-1のみが返されます。

#include #include void deal() { Printf ('signal interference! ') } void main() { Printf ('process execution! ') signal(SIGINT,deal) pause() Printf ('process end! ') }

説明:



プログラムが実行されると、一時停止により現在のプロセスがハング(スリープ状態になります)します。プロセスにSIGINT割り込み信号を送信するまで、プロセスはウェイクアップして信号を処理します。一時停止関数は、処理後に戻ります。信号を送り、続行しますプログラムを実行します。

注:どの信号もウェイクアップして一時停止する可能性があります。

  • Sigsuspend関数:

#include

int sigsuspend(const sigset_t * sigmask)

戻り値:-1、errnoをEINTRに設定します

sigsuspend関数は一時停止関数と同じであり、シグナルが発生するまでプロセスがハング(スリープ状態になる)になる可能性があります。

sigsuspend関数のパラメーターはシグナルセットです。この信号セットは、信号をシールドするために使用されます。信号はシールドされる信号に保存されます。

シグナルセットが空の場合、sigsuspendはシグナルをマスクしません。シグナルがあると、プロセスがサスペンド状態からウェイクアップする可能性があります。これは、一時停止機能と同じです。

#include #include #include void deal() { Printf ('signal interference! ') } void main() { sigset_tsigmask sigemptyset(&sigmask) Printf ('process execution! ') signal(SIGINT,deal) sigsuspend(&sigmask) Printf ('process end! ') }

説明:

この例は、上記の一時停止機能の例と同じです。

  • sigsuspendとpauseの違い:

sigsuspend関数は、一時停止機能の拡張バージョンです。 sigsuspend関数のパラメータ信号セットが空の信号セットの場合、sigsuspend関数はpause関数と同じであり、任意の信号割り込みを受け入れることができます。ただし、sigsuspend関数は信号をマスクし、指定された信号割り込みを受け入れることができます。

Sigsuspend関数=一時停止関数+マスク信号を指定

注:信号は、プログラムコードではなく、sigsuspendおよびpause関数によって中断されます。

sigsuspendは、sigprocmaskによってシールドされた信号に影響しますか?

影響! sigsuspend 元のマスキング信号は完全に無効になり、sigsuspendが戻ると、元のマスキング信号が復元されます。

  • sigsuspendはいつ使用されますか?

プログラムがビジネス処理中にいくつかのシグナルによって中断されたくない場合は、最初にこれらのシグナルをマスクできます。このビジネスプロセスの最後に、sigsuspend関数を使用して、キューに入れられたシグナルを処理できます(このプロセスでは、マスクされたシグナルを指定することもできます)。処理が完了した後、シグナルは回復前にマスクされ、次のビジネスプロセスが実行されます。処理されます。

#include #include #include void deal() { Printf ('signal processing!!n') } void main() { sigset_t sigs,sigmask int i signal(SIGINT,deal) Sigemptyset(&sigs) //sigsuspend's signal set is set to empty, indicating that sigsuspend will be / / Any signal, if you want to block some of the signal when processing the queue / / signal, you can add the corresponding signal to the signal set sigemptyset(&sigmask) sigaddset(SIGINT,&sigs) Sigprocmask(SIG_BLOCK,&sigs,0) //mask the sigint signal so that it can no longer process the business //Interference process. for(i=0 i<5 i++) { Printf ('processing business..... ') / / simulation business processing sleep(5) Printf ('Processing business end ') Sigsuspend(&sigmask) //Process the signal being queued, after processing the signal, //sigsuspend function returns and executes the next business process Printf ('processing business..... ') / / simulation business processing sleep(5) Printf ('Processing business end ') } }

説明:sigsuspend関数が呼び出されると、プロセスはハングし(スリープ状態になり)、シグナルが中断されるのを待ちます。シグナルが発生しない場合、プロセスは継続的にハングします。シグナルはあるが、そのシグナルがシグサスペンド機能のシグナル濃度ではない場合。マスクされた信号が設定されると、sigsuspendは信号を処理します。シグナルが処理されると、sigsuspend関数は次のコードを返し、実行します。