SylixOS 信号发送、接收机制

SylixOS 信号发送、接收机制

Q:SylixOS 信号发送、接收机制过程
SylixOS 可以通过 kill() 或 sigqueue() 向线程发送信号(向进程发送信号相当于发送给进程的主线程)。kill() 与 sigqueue() 的区别主要在发送信号的类型不一样,kill() 发送非排队信号,sigqueue() 发送排队信号。
kill() 中首先会调用 _doKill() 接口,在 _doKill() 中构建信号信息结构 struct siginfo 和 LW_CLASS_SIGPEND 结构,这里主要是保存信号值、信号产生源、发送信号进程号等信息,然后调用 _doSignal()。如下图所示。


_doSignal() 中会调用 __sigMakeReady() 强制将接收线程切换到就绪态,调用 __sigCtlCreate() 创建信号上下文环境。在 __sigCtlCreate() 中首先会保存接收线程的线程上下文,并创建新的线程上下文用于执行信号处理函数 __sigShell,如图。

当接收信号线程进入运行态后会执行 __sigShell() 中的代码,首先调用 __sigRunHandle() 根据不同的信号类型执行。诸如 SIGKILL 信号会退出线程、SIGUSR1 信号会调用使用 signal() 注册的信号处理钩子等。如图。

然后调用 __sigReturn() 用于返回之前的线程上下文中。如图。

sigqueue() 的区别在于信号类型为 SIGEV_SIGNAL,在 _doSignal() 中若此类型信号被屏蔽(正在执行中)则会将信号缓存入队列进行排队如图所示。


信号处理函数执行结束,在信号返回处理接口 __sigReturn() 会调用 _sigPendRunSelf() 判断当前信号缓存队列中是否存在正在等待执行的信号,若有则循环处理直至全部处理完毕。如图。


    • Related Articles

    • SylixOS 功能介绍及版本差异

      SylixOS功能介绍及版本差异 SylixOS 标准版 SylixOS 标准版是 SylixOS 的基础版本,具备如下功能: 兼容 IEEE 1003(ISO/IEC 9945)操作系统接口规范; 兼容 POSIX 1003.1b(ISO/IEC 9945-1)实时编程标准; 支持国军标 GJB7714-2012 操作系统接口规范; 优秀的实时性能(任务调度与切换算法时间复杂度为 O(1)); 支持无限多任务; 抢占式调度支持 256 个优先级; 支持虚拟进程; ...
    • 不同容器(ECS)间使用信号量同步方案

      1、概述       在 SylixOS 容器版本中由于容器间存在命名空间隔离的问题因此无法直接使用信号量进行同步操作,这在某些场合下可能无法完成实际需求,如共享内存通信时。本文介绍一种在容器间实现信号量同步功能的解决方案。 2、解决方案       此解决方案思路是在 SylixOS 标准信号量的基础上封装一层字符设备,在内核层创建信号量并提供相关接口使容器内的 APP 可以通过字符设备接口获取内核信号量句柄,再通过标准信号量 API 进行操作。实现不同容器间的 APP ...
    • SylixOS lite 版—基于 STM32F767 资源使用情况

      1、基本概念     代码段(text):顾名思义,代码存放的位置,在 STM32 中代码段一般存放于内置 FLASH 中; 已初始化数据段(data):已初始化数据段会分别体现在 FlASH 中和 RAM 中。因为是全局变量,运行过程中需要进行读写操作,因此占用一段 RAM 空间。又因为有初始值,其初始值需要占用 FlASH 空间。   未初始化的数据段(bss):bss 与 data 相同的地方时它也是全局变量,运行过程中需要进行读写操作,因此占用一段 RAM ...
    • error: xxx-sylixos-elf-lzocom.exe

      Q:IDE 在编译工程时出现:xxxx-sylixos-elf-lzocom.exe  应用程序出错。 应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。信息如下图所示。 安装 vc2010_redist_x86.exe 即可解决此问题, 此文件在 IDE 软件安装包的 Tools 目录下(如 SylixOS IDE 3.9.11_professional\Tools) 。
    • 手动修改 SylixOS 工程类型的方法

       问题描述:        当我们想要通过 IDE 重新选择已有 SylixOS Project 的 base 时,如果 base 的类型需要变化,会遇到如下图所示的问题"SylixOS Base project invalid",导致无法选择想要的base。 问题原因:        当base类型变化了,创建SylixOS Project时,工程设置里设定了base的类型。 解决方法一:       ...