signal和sigaction

2024-04-27 10:18
文章标签 signal sigaction

本文主要是介绍signal和sigaction,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

signal用于系统信号回调处理,有一下几个要注意的问题。

 

1)系统调用的中断重入。

2)不可靠性。

3)某些函数的不可重入性,如malloc,或者使用全局静态变量等返回结果等。

 

 

下面是用老的signal的信号处理方式:

 

 

int main(int argc,char** args){
    char cs[LINE_LEN];
    signal(SIGINT,handleInfoSingal);
    read(STDIN_FILENO,cs,100);
    sigset_t st,oldst,pendingst;
    sigemptyset(&st);
    sigaddset(&st,SIGINT);
    sigprocmask(SIG_BLOCK,&st,&oldst);
    printfln("begin sleep!");
    sleep(5);
    printfln("wark up!");
    sigpending(&pendingst);
    if(sigismember(&pendingst,SIGINT)){
        printfln("have it in sleep!");
    }else{
        printfln("not have it in sleep");
    }
    printfln("begin to recover!");
    sigprocmask(SIG_SETMASK,&oldst,NULL);
    printfln("end to recover!");
    int i=0;
   
    exit(0);
}

 

当系统阻塞在读取控制台的系统调用的时候,按下ctrl+c的时候,系统回打印出当前的pid,而后回重新等待用户输入。

但是你联系在此过程中按下多次ctrl+c,不会理会,这个时候因为

 

 

采用了sigaction重写以后,必须要在sa_flags加入SA_REATRT或者SA_INTERCEPT,才能够对重新启动系统调用。

 

typedef void (*handleSignal)(int singal);


void handleInfoSingal(int singal){
    printfln("%i-",getpid());
    sleep(1);
    printfln("%i+",getpid());
}

handleSignal signal1(int signalNo,handleSignal hs){
    printfln("custom signal!");
    struct sigaction sa,oa;
    sa.sa_handler=hs;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;

    #IFDEF SA_INTERRUPT
    sa.sa_flags|=SA_RESTART;

    #ENDIF

    #IFDEF  SA_RESTART

     sa.sa_flags|=SA_RESTART;

    #ENDIF
    sigaction(signalNo,&sa,&oa);
    return oa.sa_handler;
}
int main(int argc,char** args){
    char cs[LINE_LEN];
    signal1(SIGINT,handleInfoSingal);
    read(STDIN_FILENO,cs,100);
    sigset_t st,oldst,pendingst;
    sigemptyset(&st);
    sigaddset(&st,SIGINT);
    sigprocmask(SIG_BLOCK,&st,&oldst);
    printfln("begin sleep!");
    sleep(5);
    printfln("wark up!");
    sigpending(&pendingst);
    if(sigismember(&pendingst,SIGINT)){
        printfln("have it in sleep!");
    }else{
        printfln("not have it in sleep");
    }
    printfln("begin to recover!");
    sigprocmask(SIG_SETMASK,&oldst,NULL);
    printfln("end to recover!");
    int i=0;
   
    exit(0);
}

 

除此,SIGALARM信号不需要这种处理方式。

这篇关于signal和sigaction的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940228

相关文章

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

2024年 Biomedical Signal Processing and Control 期刊投稿经验最新分享

期刊介绍 《Biomedical Signal Processing and Control 》期刊旨在为临床医学和生物科学中信号和图像的测量和分析研究提供一个跨学科的国际论坛。重点放在处理在临床诊断,患者监测和管理中使用的方法和设备的实际,应用为主导的研究的贡献。 生物医学信号处理和控制反映了这些方法在工程和临床科学的界面上被使用和发展的主要领域。期刊的范围包括相关的评论论文(review p

【HDU】5958 New Signal Decomposition【离散对数下的FFT】

题目链接:【HDU】5958 New Signal Decomposition 在此先感谢小q对我的指导,没有q老师的帮助,估计永远也做不出来了。 首先我们考虑对这个式子做离散对数。令 g g为pp的某个原根,则有: bi=∑p−1j=0aj⋅r(i,j) \quad b_i=\sum_{j=0}^{p-1}a_j\cdot r(i,j) bi=∑p−1j=0aj⋅2sin32πi⋅j

Java Lock 中使用 await() 和 signal()实现 wait()/notify()机制

** Java Lock 中使用 await() 和 signal()实现 wait()/notify()机制 ** 案例 import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;

Fourier TransformHilbert TransformRelated Function's MATLAB Simulation in Signal Processing

Fourier Transform:对于平稳信号有着明确的物理意义,频域反应各频率成分,可用于滤除高频噪声分量Hilbert  Transform:平稳信号分析,在信号分析和贷通信号中,理论和实用价值,SSB Walsh-Hadamand Transform:基于非正弦正交基的信号变换 ---First Of ALL---在数学与

synchronized wait()/notify 对比 ReentrantLock await()/signal()

结论 synchronized synchronized 配合 wait()/notify 无法实现精准唤醒线程 ReentrantLock ReentrantLock 配合 Condition await()/signal() 可以实现精准唤醒线程 (指唤醒指定的线程) ReentrantLock 如何实现精准唤醒线程 一个 lock 配合多个 Condition, 且

signal(SIGPIPE, SIG_IGN)详解

SIG_DFL,SIG_IGN  分别表示无返回值的函数指针,指针值分别是0和1,这两个指针值逻辑上讲是实际程序中不可能出现的函数地址值。 SIG_DFL: 默认信号处理程序 SIG_IGN: 忽略信号的处理程序 IGPIPE 一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程. 结合TCP的"四次握手"关闭. TCP是全双工

【Python系列】signal信号处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等常用开发工具系列:常用的开发工具,IDEA,M

5G Tracking Refernece Signal--简称为TRS追踪参考信号

Tracking Refernece Signal–简称为TRS ,追踪参考信号(注意不是PTRS额!),对PTRS感兴趣的可以参考如下文章: PTRS时间密度与频率密度 TRS在3GPP CSI-RS规范文本中以NZP CSI-RS的一个子类予以定义,虽然从本质上说它并不是CSI-RS的一员。笼统的说其主要用于跟踪并补偿由于振荡器缺陷所引起的误差,从而使UE能够正确接收下行的数据。在LTE中

【CUDA编程笔记】thrust::device_vector<float> signal无法编译问题记录

thrust::device_vector signal无法编译问题记录 CUDA编程笔记 一、问题记录 正常编译时,无法编译 二、源码 #include <thrust/host_vector.h>#include <thrust/device_vector.h>#include <thrust/generate.h>#include <thrust/sort.h>#inc