信号【4】-理解实时信号


前言

提示:要解决以下疑问:

  1. 实时信号和可靠信号是一个概念吗?
  2. . 实时信号解决了标准信号的什么问题?
  3. 实时信号的处理

一. 实时信号和可靠信号是一个概念吗?

Linux中信号分两种:

  • 不可靠信号: [1~31]均为不可靠信号
  • 可靠信号:[32~63]为可靠信号或者叫实时信号

二、实时信号解决了标准信号的什么问题

实时信号比标准信号的优势是:

  • 实时信号的范围有所扩大,可以应用于应用程序的自定义信号中。而标准信号提供给应用程序随意使用的信号只有两个:SIGUSER1和SIGUSER2

  • 对实时信号采取了队列管理。如果同一实时信号实例多次传递到进程,实时信号会多次传递。而标准信号只会传递一次。

  • 对实时信号的传递顺序得到了保障。如果进程中有多个不同的实时信号处于未决状态,则会按照信号编号的大小升序传递。也就说信号编号越小,越被优先传递,优先级越高。如果多个同一类型的实时信号,传递顺序和他们的到达顺序一致。而非实时信号的处理时乱序的。

  • 当发送一个实时信号时,可为信号指定伴随数据,共接收进程的信号处理器获取。

  • 进程会优先处理实时信号,顺序传递,而非实时时乱序的

    代码一

    #include <stdio.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    void handler(int sig)
    {
        if (sig < 34)
            printf("|");
        else
            printf("&");
        
        fprintf(stderr, "catch sig:%d\n",sig);
    }
    
    int main(int argc, char **argv)
    {
        int i,k;
        sigset_t set;
        sigemptyset(&set);
    
        for (i = SIGHUP; i <= SIGRTMAX; i++){
            if (i == SIGKILL || i == SIGSTOP)
                continue;
            signal(i,handler);
            sigaddset(&set,i);
        }
    
        printf("%d\n",getpid());
        sigprocmask(SIG_BLOCK,&set, NULL);
    
        for (k = 0; k < 20; k++){
            write(1,"*",1);
            sleep(1);
        }
    
        write(1,"\n",1);
        sleep(5);
    
        sigprocmask(SIG_UNBLOCK, &set, NULL);
        return 0;
    }
    

    代码二(给代码一的进程发送信号)

    #include <stdio.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
    	int i;
    	for(i = SIGHUP; i <= SIGRTMAX;i++)
    	{
    		if(i ==	SIGKILL || i == SIGSTOP ||
    			i ==32 || i == 33)
    			continue;
    		kill(atoi(argv[1]), i);
    	}
    	exit(0);
    }
    
    >>> a.out 
    108146
    ********************
    catch sig:64
    catch sig:63
    catch sig:62
    catch sig:61
    catch sig:60
    catch sig:59
    catch sig:58
    catch sig:57
    catch sig:56
    catch sig:55
    catch sig:54
    catch sig:53
    catch sig:52
    catch sig:51
    catch sig:50
    catch sig:49
    catch sig:48
    catch sig:47
    catch sig:46
    catch sig:45
    catch sig:44
    catch sig:43
    catch sig:42
    catch sig:41
    catch sig:40
    catch sig:39
    catch sig:38
    catch sig:37
    catch sig:36
    catch sig:35
    catch sig:34
    catch sig:30
    catch sig:29
    catch sig:28
    catch sig:27
    catch sig:26
    catch sig:25
    catch sig:24
    catch sig:23
    catch sig:22
    catch sig:21
    catch sig:20
    catch sig:17
    catch sig:16
    catch sig:15
    catch sig:14
    catch sig:13
    catch sig:12
    catch sig:10
    catch sig:6
    catch sig:3
    catch sig:2
    catch sig:1
    catch sig:31
    catch sig:11
    catch sig:8
    catch sig:7
    catch sig:5
    catch sig:4
    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&||||||||||||||||||||||||||||
    

三、 实时信号的处理


总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB是一种用于科学计算和数据分析的编程语言和环境,它在实时信号处理中扮演着重要的角色。实时信号前后时刻对比是对信号处理结果的定量评估,它能够帮助我们了解信号处理算法的性能和效果。 在MATLAB中,我们可以通过编写算法和使用各种信号处理函数来实现实时信号处理。首先,我们需要获取待处理的实时信号,可以使用MATLAB提供的数据采集函数或从外部设备读入信号。然后,我们可以应用各种信号处理算法对信号进行滤波、降噪、频谱分析等操作。最后,我们可以将处理后的信号与原始信号进行对比。 实时信号前后时刻对比的核心指标通常包括信号的幅值、频谱特性和时域特性。对于幅值对比,我们可以通过计算两个信号的均方根误差(Root Mean Square Error,RMSE)或峰值信噪比(Peak Signal-to-Noise Ratio,PSNR)来评估信号处理的效果。对于频谱特性对比,我们可以使用快速傅里叶变换(Fast Fourier Transform,FFT)将信号转换到频域,然后对比两个信号的频谱图。对于时域特性对比,我们可以通过计算两个信号的相关性来评估信号处理算法的时间稳定性。 通过实时信号前后时刻对比,我们可以评估信号处理算法在去噪、滤波、频谱分析等方面的性能。如果处理后的信号与原始信号相比幅值更接近、频谱特性更清晰、时域特性更稳定,那么我们可以认为信号处理算法是有效的。否则,我们可能需要调整算法的参数、改善算法设计或选择其他算法来改进实时信号处理的结果。 总而言之,利用MATLAB进行实时信号前后时刻对比可以帮助我们评估信号处理算法的性能,从而得出可行的优化方案。这对于信号处理工程师和科研人员来说具有重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值