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.内核实现信号捕捉过程

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zxr916/article/details/111834991
今日推荐