关于linux中alarm信号处理程序

关于linux中alarm信号处理程序,第1张

默认情况下,简或收到信号后,被阻塞的系统调用(read) 会直接返回-1,同时 errno 被置成 EINTR 。这个error对应的错误信息应该类似于 " Interrupted system call"

但是很不幸,在linux上,你的代码是看不到这个现象的,因为你使用 signal() 来注册信号处理,它会把 SA_RESTART 打开,这个会导致read系统调用不返回,而是重新开始执行read *** 拦仿伍作 (这些重新执行的动作都是发生在内核,用户代码是看不到的),所以你的代码在alarm信号发生后,仍然会继续read。

如果要看到read被中断的情况,你必须使用 sigaction 这个借口来注册大友信号处理,

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)

把第二个参数 act 的成员 sa_flags 置零 (确保没有打开 SA_RESTART),你就能看到read被中断的现象了。

建议你阅读一下 Advanced Programming in the Unix Environment 这本书中关于信号相关的内容。

没那么复杂,可以用简单的余弦窗敬念代替,我试过做亮李困降噪和变调,效果挺扰物好的。

例如:

double Data_real[1024]

double Data_imagine[1024]

w=2*PI/1024

for(long i=0i<1024i++)

{

Data_real[i]*=(0.5*(cos(w*(i-1024*0.5+0.5))+1))//余弦窗

}

FFT(1024,false,Data_real,Data_imagine,real_out,imagine_out)

需要注意的是加窗之后,各处理段之间要进行重叠混合处理。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12372872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存