信号_signal函数
1.函数原型
SYNOPSIS #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
(1) 功能
设置某个信号的处理方式
-
处理方式可以被设置为忽略、捕获或默认。
-
进程的进程表(task_struct)中会有一个“信号处理方式登记表”,专门用于记录信号的处理方式,调用signal函数设置某个信号的处理方式时,会将信号的处理方式登记到该表中。
-
每个进程拥有独立的task_struct结构体变量,因而每个进程的“信号处理方式登记表”都是独立的,所以每个进程对信号的处理方式自然也是独立的,互补干扰的。
(2)参数
- 1) signum:信号编号
- 2) handler:信号处理方式
-
sighandler_t是被typedef后的类型,原型为一个函数指针类型,void (*)(int) 。
-
sighandler_t handler 也可以直接写成 void (*handler)(int)。
-
sighanler_t signal(int signum,void (*handler)(int))
-
(a) 忽略:SIG_IGN
-
(b) 默认:SIG_DFL
-
(c) 捕获:填写类型为 void (*)(int) 的捕获函数的地址。当信号发生时,会自动调用捕获函数来进行相应的处理。
- 当然这个捕获函数需要我们自己来实现,捕获函数的int参数,用于接收信号编号
- 捕获函数也被称为信号处理函数
-
1 void signal_fun1(int signo) 2 { 3 ...... 4 } 5 6 void signal_fun2(int signo) 7 { 8 ....... 9 } 10 11 int main(void) 12 { 13 signal(SIGINT,signal_fun1); 14 signal(SIGSEGV,signal_fun2); 15 16 return 0; 17 }
-
- 捕获函数什么时候被调用?
- 进程接收到信号时就被调用,调用时会中断进程的正常运行,当调用完毕后再会返回进程的征程进行。
(3)返回值
- 成功:返回上一次的处理方式
- 失败:返回SIG_ERR宏值
2.代码演示
例子1:信号有默认处理方式,这里重新设置SIGINT信号的处理方式
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <signal.h> 4 5 int main(int argc,char **argv) 6 { 7 signal(SIGINT,SIG_IGN); 8 9 while(1); 10 11 return 0; 12 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <signal.h> 4 5 int main(int argc,char **argv) 6 { 7 signal(SIGINT,SIG_IGN); //设置信号处理放方式为忽略 8 signal(SIGINT,SIG_DFL); //还原为默认处理方式 9 10 while(1); 11 12 return 0; 13 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <signal.h> 4 5 6 /*信号处理函数 7 */ 8 void signal_fun1(int signo) 9 { 10 printf("SIGINT signo = %d \n",signo); 11 } 12 13 int main(int argc,char **argv) 14 { 15 signal(SIGINT,SIG_IGN); //设置信号处理放方式为忽略 16 signal(SIGINT,SIG_DFL); //还原为默认处理方式 17 signal(SIGINT,signal_fun1); //设置信号处理方式为捕获 18 while(1); 19 20 return 0; 21 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <signal.h> 4 5 6 /*信号处理函数 7 */ 8 void singal_fun(int signo) 9 { 10 if(signo == SIGINT) 11 { 12 printf("SIGINT signo = %d \n",signo); 13 }else if(signo == SIGQUIT) 14 { 15 printf("SIGQUIT signo = %d \n",signo); 16 } 17 } 18 19 20 int main(int argc,char **argv) 21 { 22 signal(SIGINT,SIG_IGN); //设置信号处理放方式为忽略 23 signal(SIGINT,SIG_DFL); //还原为默认处理方式 24 signal(SIGINT,signal_fun); //设置信号处理方式为捕获 25 26 signal(SIGQUIT,SIG_IGN); //设置信号处理放方式为忽略 27 signal(SIGQUIT,SIG_DFL); //还原为默认处理方式 28 signal(SIGQUIT,signal_fun); 29 30 while(1); 31 32 return 0; 33 }