linux的基础知识——signal信号捕捉,信号集操作函数

1.signal捕捉信号
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

\qquad signal(SIGALRM,myfunc)函数会捕捉SIGALRM信号,捕捉之后会执行myfunc函数,而不会终止当前进程。

#include<stdio.h>
#include<sys/time.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>

void myfunc(int signo)
{
        printf("hello world\n");
}

int main()
{
        struct itimerval it , oldit;
        signal(SIGALRM,myfunc);//注册SIGALRM信号的捕捉处理函数

        it.it_value.tv_sec = 5;
        it.it_value.tv_usec = 0;
        it.it_interval.tv_sec = 1;
        it.it_interval.tv_usec =0;

        if(setitimer(ITIMER_REAL,&it,&oldit)==-1){
                perror("setitimer error");
                exit(1);
        }
        while(1);
        return 0;
}
2.信号集操作函数

\qquad 内核通过读取未决信号集来判断信号是否应该被处理。信号屏蔽字mask可以影响未决信号集,而我们可以在应用程序中自定义set来改变mask,以达到屏蔽指定信号的目的。

#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);

在这里插入图片描述

3.sigprocmask函数

在这里插入图片描述

4.sigpending函数

在这里插入图片描述

5.例子1:打印某个进程未决信号集

\qquad 其中3号信号在进程中会发出,然后被屏蔽,打印前后的未决信号集

#include<stdio.h>
#include<signal.h>
#include<unistd.h>

void printped(sigset_t *ped)
{
        int i;
        for(i=1;i<33;i++){
                if(sigismember(ped,i)==1){
                        putchar('1');
                }
                else{
                        putchar('0');
                }
        }
        printf("\n");
}
int main()
{
        sigset_t myset,oldset,ped;

        sigemptyset(&myset);
        sigaddset(&myset,SIGQUIT);

        sigprocmask(SIG_BLOCK,&myset,&oldset);

        while(1){
                sigpending(&ped);
                printped(&ped);
                sleep(1);
        }
        return 0;
}
6.例子2:signal函数的注册捕捉执行函数
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>

typedef void (*sighandler_t) (int);

void catchsigint(int signo)
{
        system("aplay /home/zhaoxr/wo.wav");
        printf("hello music\n");
}

int main()
{
        sighandler_t handler;
        handler = signal(SIGINT,catchsigint);
        if(handler==SIG_ERR){
                perror("signal error");
                exit(1);
        }
        while(1);
        return 0;
}
7.sigaction函数

在这里插入图片描述在这里插入图片描述

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>

void docatch(int signo)
{
 while(1){
      printf("hello\n");
      sleep(1);
 }
}

int main()
{
      int ret;
 struct sigaction act;
 act.sa_handler = docatch;
 sigemptyset(&act.sa_mask);
 sigaddset(&act.sa_mask,SIGTSTP);
 act.sa_flags = 0;

 ret = sigaction(SIGINT,&act,NULL);
 if(ret<0){
      perror("sigaction error");
      exit(1);
 }
 while(1);
 return 0;
}
8.信号捕捉特性

在这里插入图片描述

9.内核实现信号捕捉过程

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值