Linuxのプロセス間通信信号(信号)

1.コンセプト:

  1)、ソフトウェアレベルでのメカニズムを中断するアナログ信号である非同期通信であります

  2)信号はユーザ空間のプロセスとカーネル・プロセス間の直接相互作用することができ、カーネルプロセスは、ユーザ空間のプロセスは、システム・イベントを発生した通知するためにそれを使用することができます。

  3)プロセスが実行モードで現在ない場合、プロセスは、それに渡される前に実行を再開するまで、信号がカーネルアップによって保存され、信号は、プロセスをブロックするように設定されている場合、信号は、それまで遅延され、通過ブロッキングがキャンセルされたときにプロセスに渡されます。

2.信号上のユーザプロセスが応答します。

  任意の処理なし信号が、無視できない二つの信号が存在する:1)が信号を無視するSIGKILLとSIGSTOPは。

  2)信号を捕捉する:信号処理機能は、信号が発生した場合、対応するハンドラを実行し、定義されています。

  3)デフォルトのアクション:各指定されたデフォルトのアクションのためのLinux信号

 

3.信号:

  SIGINT:Ctrlキー+ C終結シグナル

  SIGQUIT:CTRL + \終止シグナル

  SIGTSTP:Ctrl + Z停止信号

  SIGALRM:アラーム信号は、処理を終了する。この信号タイミングの終了後に受信されます

  SIGCHLD:子プロセスの状態が変化し、親プロセスがシグナルを受信します

  SIGKILL:信号を殺します

4.関連の機能:
1)。キル(pid_t PID、INT SIG)INT;
  機能:信号送信
  パラメータ:PID:指定されたプロセス
  SIG:送信すべき信号
  戻り値:0成功し、失敗-1
2)レイズ(INT SIG)INT ;
  機能:自分の信号処理送信するため
  のパラメータを:SIG:信号
  返り値:0成功、失敗-1
。3)unsigned int型アラーム(秒unsigned int型の)
  機能:プロセスにタイマーを設定
  パラメータ:秒:一定時間内秒が
  返されます。あなたがこのアラームの前に呼び出すと()、プロセスは、そうでない場合はクロックで復帰の残り時間をアラーム時刻、時間を設定し、0されています。

注意:プロセスは一つだけアラーム時間を持つことができます。あなたはすでに新しい値に置き換えされる前に、アラーム時刻をアラームを呼び出すアラーム時刻を設定した場合

4)INTのPAUSE(ボイド);
  機能:信号が受信されるまで、呼び出しプロセスが中断されます。

。5) ボイド(*信号(シグナム、無効(*ハンドラをint型)(int型)))(int型);
  または:typedefは無効(*はsighandler_t)(INT);   シグナル・ハンドラはsighandler_t(int型シグナム、)はsighandler_t;   機能:信号処理関数   のパラメータ:シグナム://を処理することができないシグナルSIGKILLとSIGSTOPです     ハンドラ:SIG_IGN:信号を無視します。     SIG_DFL:システムのデフォルトを使用して信号を処理します。     定義された信号処理から関数ポインタ   SIG_ERR:;:成功:失敗信号処理モードを設定する前に、戻り値
  






 

:殺す関数はプロセスのpidポイントを殺すために信号を送信し、信号を高め、自分自身を殺すために送られ、  

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
    pid_t pid;
    pid = fork();
    if(pid < 0)
    {
        perror("fork fail ");
        exit(1);
    }
    else if(pid == 0)
    {
        printf("child \n");
    }
    else
    {
        kill(pid,SIGKILL);//(此处pid是子进程的进程号)杀死 pid 发送进程的信号,kill 给其他进程发送信号,指定进程号
        printf("child killed\n");
        sleep(1);
        printf("father \n");
        wait(NULL); //等待子进程结束,并回收子进程资源
        raise(SIGKILL); //杀死自己的信号,函数raise 给自己发送信号
    }
    return 0;
}

测试:子进程还未来得及运行就被杀死了

 

 例子2: 定时器的使用

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

int main(int argc, const char *argv[])
{
    printf("%d\n",alarm(7)); //7 秒定时器,此时返回 0 ,前面没有使用定时器
    sleep(2);  //睡 2 秒
    while(1)
    {
        printf("%d\n",alarm(3)); //重新设置定时器值为 3 ,返回上次定时器剩余的时间,7-2 = 5
        sleep(7); //睡7秒,后会结束进程
    }
    return 0;
}

测试:Alarm clock 是定时器结束时提醒

 

 signal 信号使用例子1 : 

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

void handler(int arg)
{
    printf("\nctrl + c\n");
//    exit(1);
//    raise(SIGKILL); 
    kill(getpid(),9); //9表示 SIGKILL 杀死信号
}

int main(int argc, const char *argv[])
{
    signal(SIGINT,handler);//定义自己的处理信号,当SIGINT信号发生时,调用 handler 函数处理
    while(1);
    return 0;
}

测试:

 

  signal 信号使用例子2 : 

 

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, const char *argv[])
{
    signal(SIGINT,SIG_IGN);// ctrl +c 信号被忽略,SIG_IGN 表示忽略该信号
    while(1);

    return 0;
}

测试: 通过 ctrl + c 信号不能终止这个进程

 

おすすめ

転載: www.cnblogs.com/electronic/p/10939769.html