实时信号和非实时信号

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

void myHandler(int num)
{
    int ret = 0;

    if (SIGUSR1 == num)
    {
        sigset_t set;
        ret = sigemptyset(&set);
        assert(!(-1 == ret));
        ret = sigaddset(&set, SIGINT);
        assert(!(-1 == ret));
        ret = sigaddset(&set, SIGRTMIN);
        assert(!(-1 == ret));
        ret = sigprocmask(SIG_UNBLOCK, &set, NULL);
        assert(!(-1 == ret));
        printf("解除阻塞 recv sig num: %d\n", num);
    }
    else if (num == SIGINT || num == SIGRTMIN)
    {
        printf("recv sig num: %d\n", num);
    }
    else
    {
        printf(" 其他信号recv sig num: %d\n", num);
    }
}

int main(void)
{
    pid_t pid;
    int ret = 0;
    // 设置回调函数
    struct sigaction act;
    act.sa_handler = myHandler;
    act.sa_flags = SA_SIGINFO;
    // 注册非实时信号的处理函数
    ret = sigaction(SIGINT, &act, NULL);
    assert(!(-1 == ret));
    // 注册实时信号的处理函数
    ret = sigaction(SIGRTMIN, &act, NULL);
    assert(!(-1 == ret));
    // 注册用户自定义信号
    ret = sigaction(SIGUSR1, &act, NULL);
    assert(!(-1 == ret));

    // 把 SIGINT  SIGRTMIN 军添加到阻塞状态字中
    sigset_t set;
    ret = sigemptyset(&set);
    assert(!(-1 == ret));
    ret = sigaddset(&set, SIGINT);
    assert(!(-1 == ret));
    ret = sigaddset(&set, SIGRTMIN);
    assert(!(-1 == ret));
    ret = sigprocmask(SIG_BLOCK, &set, NULL);
    assert(!(-1 == ret));

    pid = fork();
    assert(!(-1 == ret));
    if (0 == pid)
    {
        union sigval value;
        value.sival_int = 10;
        int i = 0;
        // 发三次不稳定信号
        for (i = 0; i < 3; i++)
        {
            ret = sigqueue(getppid(), SIGINT, value);
            assert(!(-1 == ret));
            printf("发送不可靠信号 ok\n");
        }

        // 发三次稳定信号
        value.sival_int = 20;
        for (i = 0; i < 3; i++)
        {
            ret = sigqueue(getppid(), SIGRTMIN, value);
            assert(!(-1 == ret));
            printf("发送可靠信号ok\n");
        }
        // 向父进程发送 SIGUSR1 解除阻塞
        ret = kill(getppid(), SIGUSR1);
        assert(!(-1 == ret));
    }
    while (1)
    {
        sleep(1);
    }
    return 0;
}
时间: 2024-10-10 05:56:15

实时信号和非实时信号的相关文章

实时线程和非实时线程测试

源码如下: #include<stdio.h>#include <unistd.h>#include<pthread.h> void* thread1(void* arg) { unsigned int i,j; int policy; struct sched_param param; pthread_getschedparam( pthread_self( ) , &policy, &param) ; if ( policy == SCHED_OTH

信号中断与异步信号中断安全编程

1.什么是中断? 1.1.什么是中断 外围设备的速度远低于CPU的速度,所以为提高CPU计算效率,现代计算机变内核主动为硬件主动,只在硬件需要的时候才发送信号,通知内核来处理数据.这样外围设备与内核的协作方式即为中断机制.而设备发送的信号即为中断,其本质为一种特殊的电信号. 硬中断处理流程: 1.各外围设备与中断管理器各输入引脚相连: 2.中断管理器与CPU之间只存在一条中断管线: 3.设备发送一个中断到中断管理器: 4.中断管理器发送对应电信号给CPU. 5.CPU中断当前工作,开始处理中断,

语音转写平台-非实时语音分割

1. question1:非实时音频切割出许多空白音频(len(audio) =0 ) analysis:audiosegment.length=14533 audiosegment.get_arrays_from_samples.length = 116267 根据audiosegment.arrays长度切割audiosegment对象,因为长度不一致,程序自然切割出许多空白段音频. resolve:以audiosegment.arrays为切割对象,然后将切割出的数组音频转化为audios

Linux下信号种类以及特殊信号的含义

可看到Linux支持的信号列表: $ kill -l1) SIGHUP        2) SIGINT        3) SIGQUIT       4) SIGILL 5) SIGTRAP       6) SIGABRT       7) SIGBUS        8) SIGFPE 9) SIGKILL      10) SIGUSR1      11) SIGSEGV      12) SIGUSR213) SIGPIPE      14) SIGALRM      15) SIG

Linux信号实践(4) --可靠信号

Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 功能: sigaction函数用于改变进程接收到特定信号后的行为. 参数 第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误) 第二个参数是指向结构sigaction的指针,在结构 si

gps卫星信号模拟器如何gps信号

SYN5203型GPS模拟器能够精确.无误的模拟出GPS卫星导航授时信息,通过自身可发出定位授时信息,支持实时星历和外部星历参数输入,能满足各类GPS导航仪终端的测试需求.gps信号发生器可模拟卫星颗数为16颗,正常一般是10-12颗. GPS信号模拟器输出的是真实的GPS信号,接收机接收的所有语句都能输出,在应用中接收机是分辨不出来我们的信号和真实信号的.主要有静态(定点)轨迹制作.动态轨迹制作.轨迹信号发送和实时轨迹录制4大功能.其中实时轨迹录制就是在需要后期模拟的轨迹的地方实地录制一圈,也

信号的屏蔽,信号集

1.信号集 POSIX标准定义了数据类型sigset_t #include <signal.h> int sigemptyset(sigset_t *set); 初始化一个信号集,使其不包括任何信号 int sigfillset(sigset_t *set); 用来初始化一个信号集,使其包括所有信号 int sigaddset(sigset_t *set, int signum); 用来向set指定的信号集中添加由signum指定的信号 int sigdelset(sigset_t *set,

(原) 信号(上)------信号的基本概念

一.信号的介绍 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.但是信号和中断还是有所区别的,主要的区别体现在: (1):中断有优先级,信号没有,所有的信号都是平等的: (2):中断处理程序是在内核态运行,而信号处理程序是在用户态运行: (3):中断响应是及时的,而信号响应则有较大的延时. 二.信号的产生 (1):用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如ctr+c产生SIGINT,  ctr + \产生SIGQUIT信号: (2):硬件异常产生信号,这些条件由硬

Linux信号实践(1) --Linux信号编程概述

中断 中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序; 计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以及保护现场 -> CPU(查询中断向量表, 找到中断服务程序的入口地址)执行中断处理程序 ->(处理完中断之后) ->恢复现场,继续执行原来的任务 中断分类 硬件中断(外部中断) 外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断 软件中断(内部中断) 内部中断是由CPU运行程序错误或执行内部