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は関数と同じ名前を持ちます:具体的な情報は以下の通りです:
5.1 sa_handler:プロトタイプvoid handler(int)(旧タイプのシグナルハンドラ)のシグナルハンドラアドレスを指す関数ポインタ。
void(* sa_handler)(int); //古い型の信号処理関数ポインタ
void(* sa_sigaction)(int、siginfo_t *、void *); //新しい型の信号処理関数のポインタ
sigset_t sa_mask; //ブロックされたシグナルセット
int sa_flags; //シグナル処理モードマスク
void(* sa_restorer)(void); //予約
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()がシグナルハンドラを登録するとき、選択されたシグナルセットはキャプチャされたシグナルが処理されるときにだけブロックされます。
Linuxでのディスクパーティション、ファイルシステムのフォーマットとRAIDデバイス Linuxシステムでのディスクパーティションのフォーマットの比較 Windows ブートディスクを挿入するのは非
ダウンロードコンパイルとインストールは非常に簡単です。最初にいくつかの共通の依存関係をインストールする必要があります。このスクリプトはインストールすることができます。このスクリプトを任意のテキスト形式
別のLinuxディストリビューションでは、このようなSUSE Linuxディストリビューションとして、情報システム、さまざまなを表示することができます異なるGUIプログラムを持っている、ある偉大なグラ
以前にコンパイルされた通常のプロジェクト(IAR5.5で確立)を開くと、コンパイラは次のエラーを表示します(現在使用されているIAR6.3)。 エラー[Pe147]:宣言は、「__ interwork