文章目录
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;
}