Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxナレッジレクチャー:Linuxシグナルとブロッキング

Linuxナレッジレクチャー:Linuxシグナルとブロッキング

  


1.シグナルマスク - ブロックされたシグナルセット


各プロセスには、どのシグナル伝達を説明するかが記述されていますブロックされるシグナルセット。シグナルがプロセスのブロッキングシグナルセット内にある場合、プロセスに送信されるシグナルはブロックされます。プロセスによって現在ブロックされているシグナルのセットは、sigset_t型のシグナルマスクとも呼ばれます。各プロセスは独自のシグナルマスクを持ち、子プロセスが作成されると、子プロセスは親プロセスのシグナルマスクを継承します。


2.シグナルのブロックと無視の違い


ブロックの概念はシグナルの無視とは異なります。オペレーティングシステムは、シグナルがプロセスによってブロック解除されるまでシグナルを渡しません。出て行くと、ブロックされたシグナルはプロセスの振る舞いに影響を与えず、シグナルは通過を一時的にブロックされるだけで、プロセスがシグナルを無視するとシグナルは渡されますが、プロセスはシグナルを破棄します。


3.シグナルセットの操作


シグナルセットは以下の関数で操作できます。


int sigemptyset(sigset_t * set) //シグナルセットをクリアする


int sigfillset(sigset_t * set); //すべてのシグナルをセットに書き込む


int sigaddset(sigset_t * set、int signum) set signumにシグナルを追加する


int sigdelset(sigset_t * set、int signum); //set signumからシグナルを削除する


int sigismember (const sigset_t * set、int signum); //signnumがセットに含まれているかどうかを判断し、1を返し、0を返さない。初期設定では、シグナルセットをクリアするためにsigemptyset()を使用することが多い。 sigaddset()を使用してシグナルをシグナルセットに追加するか、sigfillset()を使用してすべてのシグナルをシグナルセットに追加してからsigdelset()を使用してシグナルを削除します。


4. sigprocmask()の概要


関数sigprocmask()を使用して、プロセスのシグナルマスクを確認または変更することができます。関数情報は以下のとおりです。


#include


int sigprocmask(int how、const sigset_t *制限セット、


sigset_t * restrict old);


パラメータhowは、シグナルマスクの変更方法を示す整数です。


SIG_BLOCK --- setが指すシグナルセット内のシグナルを現在のブロックシグナルに追加します。


SIG_UNBLOCK ---現在のブロッキングシグナルセットから、setがポイントするシグナルセットのシグナルを削除します。


SIG_SETMASK --- setがポイントするシグナルセットを指定します電流ブロック信号セットです。


さらに、パラメータセットがNULLの場合、説明を変更する必要はなく、oldがNULLの場合、sigprocmaskは変更前のシグナルセットを* oldに返します。 //この記事はwww.45it.comのコンピュータソフトウェアとハ​​ードウェアのアプリケーションネットワークから転送されたものです。


5.sigaction()レビュー


以前のsigaction()関数で使用されたもの:
int sigaction(int signum、const struct sigaction * act、


const struct sigaction * oldact);

この機能は、信号処理機能を登録するために使用される。パラメータ構造体sigactionは関数と同じ名前を持ちます:具体的な情報は以下の通りです:

sigaction {


void(* sa_handler)(int); //古い型の信号処理関数ポインタ


void(* sa_sigaction)(int、siginfo_t *、void *); //新しい型の信号処理関数のポインタ


sigset_t sa_mask; //ブロックされたシグナルセット


int sa_flags; //シグナル処理モードマスク


void(* sa_restorer)(void); //予約

5.1 sa_handler:プロトタイプvoid handler(int)(旧タイプのシグナルハンドラ)のシグナルハンドラアドレスを指す関数ポインタ。
5.2 sa_sigaction:プロトタイプを指すための関数ポインタでもあります。voidハンドラ(int(信号処理関数の新しいタイプ);)


3つのパラメータの意味は次のとおりです。

iSignNum:入力信号

pSignInfo:信号に関する情報、構造体です。


pReserved:予約済み、現在は使用されていません。


5.3 sa_handlerとsa_sigactionには1つだけ含めるべきです。古いシグナル処理メカニズムを使用したい場合は効果的です、そうでなければsa_handlerに正しいシグナル処理関数をポイントさせ、sa_flagsフィールドにSA_SIGINFOオプションを含めるようにする必要があります。


5.4 sa_maskは、信号処理の実行時にブロックされる信号を表す信号のセットを含む構造体で、前の項で説明した5つの関数を使用して操作できます。 5.5フィールドsa_flagsは、信号処理中に取るべきいくつかの動作を示すマスクの集合の複合です。
各マスクの意味は次のとおりです。


(1)SA_RESETHAND ---キャプチャされる信号を処理した後、信号処理機能の登録は自動的に取り消されます。つまり、次の生成された信号の処理を継続するには、信号処理機能を再登録する必要があります。


(2) SA_NODEFER ---別の信号を処理するときに、別の信号が再び発生した場合は、ただちに他の信号の処理に入りますが、他の信号の処理が終わったら、現在の信号の処理、つまり通常の処理を続けます。 。 sa_flagsにマスクが含まれている場合、struct sigactionのsa_maskは無効になります。


(3)SA_RESTART ---シグナルが生成された場合、プログラムはシステムコール(呼び出しなど)をブロックしています。 read()関数は、シグナルを処理した後にブロックされたシステムから戻ります。このマスクは通常のプログラム処理フローに準拠しているため、通常はマスクを設定する必要があります。そうしないと、シグナルの処理後にブロックされたシステムコールが失敗を返します。


(4)SA_SIGINFO - - sa_flagsにマスクが含まれている場合はsa_sigactiionポインタが有効であり、それ以外の場合はsa_handlerポインタは有効です。


関数sigprocmaskはフルレンジブロッキングであり、ブロッキングセットがsigprocmaskに設定されると、ブロックされたシグナルはシグナル処理関数でキャプチャできなくなります。ブロッキング信号のセットがリセットされるまで。 sigaction()がシグナルハンドラを登録するとき、選択されたシグナルセットはキャプチャされたシグナルが処理されるときにだけブロックされます。

Windows 8でのシステムサウンドスキームの変更方法

Windows 7システムにtelnetクライアントをインストールする方法

Windows 8システムのMACアドレス変更方法グラフィックチュートリアル

Linuxオペレーティングシステムがプロセスを強制終了する方法を詳しく説明します。

今日の社会では、コンピュータが普及してきていますが、私たちはコンピュータを使用していますが、コンピュータがどのように機能するかを知っていますか? Linuxオペレーティングシステムの開発は非常に急速であり、マイクロソフトに追いつく傾向があります。 Linuxオペレーティングシステムの知識があるので、Linuxオペレーティングシステムの使い方を学ぶことができます。今日は、Linuxオペレーティングシステムでの強制

誰もが触れることのできない無敵のフォルダを作るように教えてください

低炭素の省エネWindows 7の眠っているいくつかの姿勢の詳細な説明

コースウェア印刷用に用紙

WAR7 1.24バージョンのソリューションをプレイするWIN7対バトルプラットフォーム

あなたは、「ディスククリーンアップウィザード」をクリックすると、少ないディスクスペースで実行しているWindows XPベースのコンピュータは、その打ち上げ後、「低ディスクを受信したときに説明XPのディスク容量は、要約

Windows10イメージをインストールする方法? Windows 10イメージのインストール方法

Copyright © Windowsの知識 All Rights Reserved