Linux关于信号

信号的概念

信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。 信号是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等 它们由shell和终端管理器产生以引起中断。 进程可以生成信号、捕捉并响应信号或屏蔽信号

signal库函数

如果想让程序能够处理信号,可以使用 signal库函数,要引入头文件<signal.h>

void (*signal(int sig, void (*func)(int))) (int);

signal是一个带sig和func两个参数的函数,准备捕捉或屏蔽的信号由参数sig给出,接收到指定信号时将要调用的函数由func给出。 func这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void func也可以是下面两个特殊值:         SIG_IGN    屏蔽该信号         SIG_DFL    恢复默认行为

贴上代码:

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

void signle_handle(int signo)
{
    printf("catch signa no is %d\n",signo);
}


int main()
{
    signal(SIGINT,signle_handle);
    signal(SIGUSR1,signle_handle);

    while(1)
        pause();
    return 0;
}

使用single_handle来捕捉信号

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

扫描二维码关注公众号,回复: 3266216 查看本文章

void signle_handle(int signo)
{
    printf("catch signa no is %d\n",signo);
}


int main()
{
   // signal(SIGINT,signle_handle);
   // signal(SIGUSR1,signle_handle);

    int pid = fork();
    
    signal(SIGCLD,SIG_IGN);
    if(pid > 0)
    {
      signal(SIGINT,signle_handle);
      while(1)
         pause();
    }
    else if(pid == 0)
    {
       while(1)
       {
            sleep(1);
           kill(getppid(),SIGINT);
       }
    }
    else
    {
        perror("fork error");
    }

    return 0;
}

使用父子进程,父进程接受信号,子进程kill来发送信号

不可靠信号

linux信号机制基本上是从unix系统中继承过来的。早期unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。 早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。 linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,linux下的不可靠信号问题主要指的是信号可能丢失。

可靠信号

随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种unix版本分别在这方面进行了研究,力图实现"可靠信 号"。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。 同 时,信号的发送和安装也出现了新版本:信号发送函数sigqueue()及信号安装函数sigaction()。

实时信号

早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核的支持。前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL ^C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。 非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

总结:我们把信号分为实时信号和非实时信号,实时信号支持排队不会丢失,非实时信号不支持排队并且会丢失,实时信号都睡觉可靠信号,非实时信号都是不可靠信号。

猜你喜欢

转载自blog.csdn.net/Gaodes/article/details/82664270