linux信号处理

本文介绍了Linux下两种信号处理方式:signal函数处理与信号集处理。详细解析了signal函数的使用方法,并通过示例代码展示了如何处理SIGUSR1信号。同时,文章还深入探讨了信号集的常用操作函数及其应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux处理信号的方式有2种:一种是signal函数处理,另一种是信号集处理。

系统的信号一共有64个如下:

执行 kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

1、signal的用法。

按下Kill -10 pid的时候,会执行的内容

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
static void pro_func(int signo){
    printf("Receive the Signo:%d",signo);
}
int main(){
    if(signal(SIGUSR1,pro_func) == SIG_ERR){ //信号注册失败
        printf("SIGUSR! is ERROR \n");
    }
    while(1){
        pause();//让进程挂起,直到捕获到一个信号
    }
}


2、信号集的用法。

信号集是一个能表示多个信号的数据类型,sigset_t set ;set即一个信号集。

常用函数:

int sigemptyset(sigset_t *set); 将set集合置空
  int sigfillset(sigset_t *set); 将所有信号加入set集合
  int sigaddset(sigset_t *set,int signo); 将signo信号加入到set集合
  int sigdelset(sigset_t *set,int signo); 从set集合中移除signo信号
  int sigismember(const sigset_t *set,int signo); signo判断信号是否存在于set集合中

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
static void quit(){
    printf("I am QUIT\n");
}
int main(){
    sigset_t newmask;
    sigset_t oldmask;
    sigset_t pendmask;

    signal(SIGQUIT,quit);

    //添加信号
    sigemptyset(&newmask);
    sigaddset(&newmask,SIGQUIT);

    //信号屏蔽
    sigprocmask(SIG_BLOCK,&newmask,&oldmask);
    printf("sleep start\n");
    sleep(10);
    printf("sleep end\n");   //10s内不会触发SIGQUIT信号

    printf("start get mask\n");
    sigpending(&pendmask); //获取被挂起的信号集,存到pendmask中
    if(sigismember(&pendmask,SIGQUIT)){
        printf("SIGQUIT pending\n");
    }else{
        printf("NO SIGQUIT \n");
    }
    sigprocmask(SIG_SETMASK, &oldmask, NULL);//恢复被屏蔽的信号SIGQUIT
    sleep(10); //10s内会触发SIGQUIT信号
    return (0);
}
gcc -c set.c

gcc -o set set.o

./set








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值