Linux学习笔记11 - 进程间通信(IPC)(二)

信号

  • 其源于 UNIX 中的一种的古老方法,其是在软件层次上对中断机制的一种模拟(软中断),是一种异步通信方式。可以直接进行用户空间进程(user process)内核进程(kernel process)之间的交互,内核进程也可以利用其来通知用户空间进程(user process)发生了哪些系统事件。如果该进程(Process)当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程

引用图片

  • 信号类型简介 :
    • 最初之时,UNIX 系统只有1-31总共31个信号,这些信号每个都有特殊的含义和特定的用法。其特点是用bit flag实现的。此会导致当一个信号还在待决的时候,又来了一个同样的信号,再次设置bit位是没有意义的,因此就会丢失一次信号。为了解决该问题,后来 POSIX 规定增加32-64这33个信号作为实时信号,并规定实时信号不能丢失,要用队列来实现。把之前的信号1-31叫做标准信号,由于标准信号会丢失,因此也称做不可靠信号,由于标准信号是用bit flag实现的,所以标准信号也叫做标记信号(flag signal)。由于实时信号不会丢失,所以也叫作可靠信号,由于实时信号是用队列实现的,因此也称做排队信号(queue signal)。如平常遇到的SIGSEGV、SIGABRT等信都是标准信号。

引用图片

  • 用户进程响应信号的3种方式:
    • 忽略信号:即对信号不做任何处理,但是有两个信号不能忽略,即 SIGKILL 及 SIGSTOP。
    • 捕捉信号:定义信号处理函数,当信号发生时,执行相应的自定义处理函数。
    • 缺省操作:系统对每种信号都规定了默认操作,当发生了该信号,系统会自动执行。
信号发送函数
kill函数
raise函数
alarm函数
pause函数
  • 函数说明:
    • kill()函数既可以中止进程(实际上发出 SIGKILL 信号),亦可以向进程发送其它信号。
    • raise()函数允许进程向自己发送信号。
    • alarm()函数亦称闹钟函数,其在进程中设置一个定时器,当指定时间到,就向进程发送SIGALARM信号。
      • 注:一个进程只能设置一个闹钟时间,若设置多个,其值会被最新设置的覆盖代替。
    • pause()函数是将调用的进程挂起直到捕捉信号为止。
  • 信号处理:
    • 两种处理方法: singal()函数(还有一个更健壮、新的函数sigaction())信号集函数组
      • 使用signal()函数时,只需要指出要处理的信号处理函数即可,其主要是用于前32种非实时信号的处理,不支持信号传递信息。
      • 信号集函数组调用顺序功能模块:创建信号集合注册信号处理函数以及检测信号
        • 创建信号集合:
          • sigemptyset()将信号集合初始化为空
          • sigfillset()将信号集合初始化为包含所有已定义的信号的集合
          • sigaddset()将指定信号加入到信号集合中去
          • sigdelset()将指定信号从信号集合中删除
          • sigismember()查询指定信号是否在信号集合之中
    • 注:信号集里的信号并不是真正可以处理的信号,只有当信号的状态处于非阻塞状态时才会真正起作用。
创建信号集合函数组
sigemptyset函数
将信号集合初始化为空
sigfillset函数
将信号集合初始化为包含所有已定义的信号的集合
sigdelset函数
将指定信号加入到信号集合中去
sigismember函数
查询指定信号是否在信号集合之中

  • 参考文献:《Linux嵌入式应用程序开发标准教程》
  • 参考资料: https://zhuanlan.zhihu.com/p/537431439
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值