sigaction函数解释

 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)   暂时没有使用

原文地址:https://www.cnblogs.com/notepi/p/2882063.html