文章目录
- 1.signal捕捉信号
- 2.信号集操作函数
- 3.sigprocmask函数
- 4.sigpending函数
- 5.例子1:打印某个进程未决信号集
- 6.例子2:signal函数的注册捕捉执行函数
- 7.sigaction函数
- 8.信号捕捉特性
- 9.内核实现信号捕捉过程
1.signal捕捉信号
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
\qquadsignal(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;
}