【Linux】--信号

信号

まず、どのような信号?

どのような信号?など交通信号、クラスベル、など栗、の場合は、信号、人へのメッセージです。Linuxでは、信号は、ソフトウェアの割り込みで、イベント通知プロセスが発生している、現在のプロセスの動作を中断することは、このイベントは、イベントを表す信号に対処するために、実行されています。
様々な信号がありますが、それぞれが異なるイベントを表します。

  • 人生信号の周期
    プロセスに登録し、信号生成、信号処理を破壊し、信号[ここに画像の説明を挿入]!
    ここに画像を挿入説明

  • 信号の種類:
    これに先立ち、まず信頼性の高い信号、どのような信頼できない信号が何であるかを理解できますか?
    たとえば、クラスの先生は、二回の仕事を割り当てられたが、最終的にあなたは、信頼性の高い信号であるが、信号が信頼できない仕事を、完了するまでに二回、このプロセスに対処失ったら、悪い学生の同等は、1つのジョブのみ、別の仕事を持っていました。私たちは、コマンドkill -lを使用して信号の種類を確認するには:

    1-31信頼性の高い信号は、損失事象は発生しません
    34から64まで、信頼性の低い信号は、損失事象をもたらすことができます

第二に、信号の概念

  • 信号の配信:プロセスで登録動作信号の実際の実装の信号処理:処理PCBの信号フラグを変更するためのオペレーティング・システム
  • ペンディング信号:信号の保留中の送達中から状態信号を生成するが、要するに、条件が処理されるのを待って、保留されていると称される
  • (ブロッキング)信号をマスクする:信号をシールド装置におけるマスク処理が送信される場合、プロセスは一時的に、特定の信号を受け入れていない、信号が都市に捕捉することができない、時間の期間放出処理する場合、信号後の信号をマスクしますこれは、キャプチャされます
  • 信号を無視:プロセスは、ターゲット・プロセスに到達してきましたが、ターゲット・プロセスは直接破棄を扱っていません

第三に、信号を生成します

   (1)硬件产生
  • Ctrl + Cは、処理を終了する、実質的にSIGINT信号を生成します。
  • CTRL + \(後デバッグを容易にするために、最後の言葉と等価コアファイル、ストア動作データ)信号が生成されるSIGQUIT、およびコア・ダンプを終了するためのプロセス。
  • CTRL + Z SIGTSTP信号は、フォアグラウンドプロセスの終了を生じました。
    生成する(2)ソフトウェア
  • システム機能キルシグナムのPIDを呼び出します。このプロセスは、特定を指定するための信号を送り、
  • raise関数:現在のプロセスにシグナルを送ります
  • アボート機能:異常終了プロセスを引き起こし、それ自体にSIGABRT信号を送ります
  • アラーム(int型秒):表現アラームこの関数を呼び出すときに、タイマーに自分自身に信号相当を送信するためにseconds秒を待ちます

第四に、登録信号

信号在进程中的注册说白了就是操作系统修改进程pcb中的一个信号标志位

PCB内のビットマップを有しているオペレーティングシステムが送信するオペレーティングシステムなど、プロセスに信号を送信すると、ビットマップは、その着信信号がないことを示す、以下のように初期状態は、0であり、小格子の一つでありますランク2の信号は、その後、時間は2番グリッドはフラグを変更しながら、現在のプロセスは、2番信号を受信したことを示し、1に設定されているであろう。
ここに画像を挿入説明
そして、ここで私たちが前に言ってきた保留保留信号のコレクションです。
この時点で知っている我々はすでに、信号の登録処理は、実際にあなたにこのイベントに来てのプロセスを伝えるために、ビットマップフラグが変更され、これが事実である場合いること:システムは、信号の数2を送信し、我々はフラグ信号IIを設定します信号を処理していない前に、1、、彼のフラグが再び、1 1であり、同じ信号番号2は、どのようにそれを行うには?今回はどのように信頼性の高い信号を知る必要があり、信号が信頼できないが、この状況を区別しています。

  • 信頼性の低い信号:保留中の信号の現在のセットが登録されている信号を指定した場合は、何もしません。同時に一つのノードのみそれ

  • 信頼性の高い信号:かかわらず、現在の信号が登録されているのは、新しいノードを追加するとき、sigqueue、ビットマップを変更することになります。

    栗のシンプルな弱を理解するために:私たちは食器棚に置くべき項目がある場合は、信頼性のない信号のために、彼は言ったキャビネットはそこらで行くとアイテムを入れていない、アイテムを保存しているだろう。信頼性の高い信号の場合は、アイテムがないに関係なく、私はその後、フラグが1にセットされ、中に配置する必要があります。

第五に、キャンセル信号

信号的注销其实就是删除当前信号的一个sigqueue节点,并且修改位图

信頼性が高く、信頼性の低い信号について、その信号、同じ二つの方法。

  • 信頼できない信号:ノードを削除した後、ビットマップが0に設定されている指示
  • 信頼性の高い信号:ノードを削除した後、ノードは同じではない場合、ビットは、図2に0に設定されているがあるか否かを判断します。

第六に、信号処理

信号処理は、また、我々は信号を受信した信号の送達として知られています。
3通りの方法で信号を扱う:、モードの処理デフォルトの処理を無視して、カスタムの取り扱い
男信号コマンドを使用してビューを、我々は信号機能の2つのパラメータで、その後、カスタムコールバック関数を見つけました:
ここに画像を挿入説明
信号(INTシグナム、はsighandler_tハンドラ)
第一引数:我々はシグナル番号1-64の前に言ったことを
第二引数:コールバック関数は二つのパラメータが定義されていました:SIG_IGN:信号を処理、SIG_DFLを無視されている方法を変更します:私たちは、デフォルトのアプローチ方法を変更します。
そして、このコールバック関数は、戻り値を定義されていない第2行目で見ることができますが、コールバック関数のint型の引数があります。アプリケーション信号機能について何を示しています

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

int main()
{
        signal(2,SIG_IGN);
        while(1)
        {
        printf("----------\n");
        sleep(10);
        }
        return 0;
}

結果で見てみましょうスクリーンショット:
ここに画像を挿入説明
あなたは正常にコンパイルされて見ることができますが、Ctrlキーを押しながら+ C第二引数のSIG_IGNは、私たちの信号は、信号処理第2を無視する関数であることであるためと、実行を停止しませんでした道。それはCRTL + CJその役割を押したままにせず、停止実行するために押したままにすることができ、CTRL + \
今では、コールバック関数sigcbを、定義する任意の信号信号IIとIII信号の到着は、コールバック関数sigcbの引き金となるような
ここに画像を挿入説明
外観を結果を見て:
ここに画像を挿入説明
私たちは+ C、Ctrl業績を説明し、システムは、CTRL + \時間が第3信号を受信し、第2信号を受信します。ここでは、明らかに私たちが最初にスリープ状態に始まったことを疑問、なぜCTRL + CまたはCtrl +時間は、イベントが終了したときに実行され、信号が現在の操作を中断しますので、これはある?「------」、すぐに印刷します\だ、と実行はスリープ状態に戻っていきます。
より背の高い、このインタフェースは、我々の焦点を導入することで、私たちはsigactionインタフェースの実装を使用しても、このインタフェースを信号に道ここでの信号、は、sigaction関数を変更します。manページで確認してください:
ここに画像を挿入説明

  • 最初のパラメータ:シグナムID信号

  • 第二引数:、sigaction構造体*行為は、新しい移動信号を表し、ここにいると、この構造体が含まれているかを見ることができた構造であります

struct sigaction 
{
	void (*sa_handler)(int);//类似于调用signal函数
	void (*sa_sigaction)(int, siginfo_t *, void *);//信号捕获函数,可以获取其他信息
	sigset_t sa_mask;//执行信号捕获函数期间要屏蔽的其他信号集合
	int sa_flags;//影响信号行为的特殊标志
	void (*sa_restorer)(void);//没有使用,作为了解
}
  • 第三引数:信号* oldact原信号シグナム作用を得るために使用されます。(実際には、バックアップされた)
    この関数の適用を見て、わずかに改善さに基づいて、元のコードに
int main()  
{          
        signal(2,sigcb);
//      signal(3,sigcb);
        struct sigaction newact;
        struct sigaction oldact;
        newact.sa_handler=sigcb;    //设置自定义回调函数
        newact.sa_flags=0;     //默认使用sa_handler回调函数
        sigemptyset(&newact.sa_mask);  //清空临时要阻塞的信号集合
        sigaction(2,&newact,&oldact);
        while(1)
        { 
        printf("----------\n");
        sleep(10);
        }
}

実際には、我々は最後の実行の効果と同じ効果を実行します。

概要

これらは、信号ライターの概念で説明する信号登録信号の先頭に破壊し、信号生成した信号の流れに従って処理され、処理を書いて、おそらく他のブロガーは、私の部門よりも高度になり、希望の読者は、エラーを指摘し、私たちは心を開いて、共通の進歩を採用しなければならない、提案を与えます。
次は、自己キャプチャプロセス定義信号、期待がたくさんあります。

公開された33元の記事 ウォン称賛13 ビュー1063

おすすめ

転載: blog.csdn.net/Vicky_Cr/article/details/103285170