1 #include <stdio.h> 2 #include <string.h> 3 #include <unistd.h> 4 #include <signal.h> 5 int g_iSeq=0; 6 7 void SignHandlerNew (int iSignNo ,siginfo_t *pInfo,void *pReserved) 8 { 9 int iSeq=g_iSeq++; 10 printf("%d enter Signhandlernow.signo:%d.\n",iSeq,iSignNo); 11 sleep(3); 12 printf("%d leave Signhandlernow.signo:%d.\n",iSeq,iSignNo); 13 } 14 void main() 15 { 16 char szBuf[20]; //设定缓存区 17 int iRet; 18 struct sigaction act; 19 act.sa_sigaction=SignHandlerNew; 20 act.sa_flags=SA_SIGINFO; 21 sigemptyset(&act.sa_mask); 22 sigaction(SIGINT,&act,NULL); 23 sigaction (SIGOUT,&act,NULL); 24 do{ 25 iRet=read(STDIN_FILENO,szBuf,,sizeof(szBuf)-1); 26 if(iRet<0) 27 { 28 perror("read fail."); 29 break; 30 } 31 szBuf[iRet]=0; 32 printf("get:%s,"szBuf); 33 } 34 while(strcmp(szBuf,"quit\n")!=0); 35 return 0; 36 }
上面是一个例文代码。
头文件不解释,结构体的使用不解释,不明了的自己谷歌。
进入正题
7 void SignHandlerNew (int iSignNo ,siginfo_t *pInfo,void *pReserved)
这是一个函数,要讲的一点就是,SignHandlerNew属于函数的指针,使用函数名字也就是指针的引用,在后面会讲到。
18 struct sigaction act;
设定一个结构体函数数据类型成员 act,sigaction是一个系统默认结构函数。sigaction函数原型为
1 struct sigaction
2 {
3 void (*sa_handler); 4 void (*sa_sigaction)(int,siginfo *, void *);5 sigset_t sa_mask; 7 int sa_flags; 8 void (*sa_restorer)(void); 9 }
sa_handler 是一个函数指针,用于指向原型为void handler(int)的信号处理函数地址【在前面有提及,下同】,即老类型的信号处理函数。
*sa_sigaction 是一个函数指针,指向一个void handler(int iSignum,siginfo_t *pSigInfo,void *pReserved);
的信号处理函数,即新类型的信号处理函数。sigaction
其中iSignum为传入的信号
pSigInfo:与该信号相关的一些信息,也是一个结构体
pReserved:没有使用。
在sigaction结构体函数中,指向新函数和老函数的指针只能有一个可以正常使用。
继续介绍sigaction结构体的成员类型 sa_mask ,这个是被阻塞信号集合.所谓阻塞信号集合就是,当sigaction函数遇到要捕捉的函数时,信号集合内的信号将被堵塞,也就是暂时扔到一边,先不处理.
int sa_flags;为信号处理方式掩码,其中包含使用哪个函数指针.具体大家谷歌。
void (*sa_restorer)(void) 暂时没有使用