Linux下的信号使用

Linux的信号可以想象成红绿灯,灯变化颜色,你就知道可以通行与否。

导入头文件#include <signal.h>

// 收到信号的处理函数
void  handle(int sig, siginfo_t *si, void *uc)
{

    printf("handler:%d %d\n", sig, si->si_pid);
    exit(0);
}


int main() {

    stack_t ss;
   // SIGSTKSZ 大小, 数字不能随便设置 
    ss.ss_sp = malloc(SIGSTKSZ);
    if (ss.ss_sp == NULL)
    {
        return -1;
    }

    ss.ss_size = SIGSTKSZ;
    ss.ss_flags = 0;

    // 使用独立的调用栈,方式有些错误导致原有的调用栈无法使用,比如栈移除
    int ret = sigaltstack(&ss, NULL);

    if (ret != 0)
    {
        return -1;
    }
   // 表示一个信号
   // 如果使用sa_sigaction必须设置,sa_flags = SA_SIGINFO
    struct sigaction act;
    act.sa_flags = SA_SIGINFO | SA_ONSTACK;

    act.sa_sigaction = handle; // 处理函数的具柄,一个函数指针
    if(sigemptyset(&act.sa_mask) != 0)
    {
        return -1;
    }


    struct sigaction orig_act;
    // 注册信号, 第一个参数有多种类型,SIGINT表示ctrl+c终止程序
    ret = sigaction(SIGINT, &act, &orig_act);
    if (ret != 0)
    {
        return -1;
    }
    return 0;
}
声明:原创文章,版权所有,转载请注明出处,https://litets.com。