信号的认识

信号的认识

         软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用 kill 发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。

信号的种类

         查看 linux 系统信号:

               使用 kill 命令:

                    kill 命令功能并不是杀死进程,而是向进程发送信号,当进程接收到信号后,会执行系统默认的操作,而大多数的   操作都会使程序退出。

                kill -l


        信号分为可靠信号与不可靠信号,可靠信号又称为实时信号,不可靠信号又称为非实时信号。

        可靠信号:

            信号代码从SIGRTMIN到SIGRTMAX之间的信号是可靠信号,可靠信号支持排队不存在丢失。

        非可靠信号:

            信号值小于 SIGRTMIN 的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是信号可能丢失(进程收到的信号不作排队处理,相同的信号多次到来会合并为一个)。

信号的生命周期

        信号产生->信号注册->信号在进程中注销->信号处理函数执行完毕

                    

        信号产生

                信号的产生是指触发信号的事件发生,它的来源有:

                        1.程序错误,如非法访问内存

                        2.外部信号,如按下CTRL+C

                        3.通过kill或sigqeue向另外一个进程发送信号

        kill函数:

                向指定进程发送信号

                

        sigqueu函数:

               向指定进程发送信号,可携带一个参数

                

        示例:

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

int main(int argc, char* argv[])
{
    int pid;
    union sigval val;
    val.sival_int = 1;
    pid = getpid();
    kill(pid, SIGINT);
    sigqueue(pid, SIGINT, val);
    while (1){
        sleep(1);
    }
    return 0;
}

        信号注册

            可靠信号注册机制:

                内核每收到一个可靠信号都会去注册这个信号,在信号的未决信号链中分配 sigqueue 结构,因此,不会存在信号丢失的问题。

            不可靠信号注册机制:

                对于不可靠的信号,如果内核已经注册了这个信号,那么便不会再去注册,对于进程来说,便不会知道本次信号的发生。不可靠信号只注册一次,只有一个sigqueue 结构。

        信号在进程中注销

            在进程的执行过程中,每次从系统调用或中断返回用户空间的时候,都会检查是否有信号没有被处理。如果这些信号没有被阻塞,那么就调用相应的信号处理函数来处理这些信号。则调用信号处理函数之前,进程会把信号在未决信号链中的 sigqueue 结构卸掉。是否从未决信号集中把信号删除掉。

        信号处理

            信号响应的方式:

                    1.采用系统默认处理 SIG_DFL,执行缺省操作

                    2.捕捉信号处理,即用户自定义的信号处理函数来处理

                    3.忽略信号 SIG_IGN ,但有两种信号不能被忽略 SIGKILL,SIGSTOP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值