linux中的信号2——进程如何处理信号?

来源:互联网 发布:淘宝卖医疗器械手续, 编辑:程序博客网 时间:2024/06/05 07:22

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。


1、signal函数介绍




(1)举例:用signal函数处理SIGINT信号(这个信号由ctrl+c时发出)

  • 默认处理
  • 忽略处理
  • 捕获处理

#include <stdio.h>#include <signal.h>#include <stdlib.h>typedef void (*sighandler_t)(int);void func(int sig){if (SIGINT != sig)return;printf("func for signal: %d.\n", sig);}int main(void){sighandler_t ret = (sighandler_t)-2;//signal(SIGINT, func);                 // 指定信号SIGINT为绑定处理函数//signal(SIGINT, SIG_DFL);// 指定信号SIGINT为默认处理ret = signal(SIGINT, SIG_IGN);// 指定信号SIGINT为忽略处理if (SIG_ERR == ret){perror("signal:");exit(-1);}printf("before while(1)\n");while(1);printf("after while(1)\n");return 0;}

  • signal函数绑定一个捕获函数后,信号发生后会自动执行绑定的捕获函数,并且把信号编号作为传参传给捕获函数;
  • signal的返回值在出错时为SIG_ERR,绑定成功时返回信号之前绑定的旧的处理函数。(因为我们用signal为信号绑定了新的处理函数)

(2)signal函数的优点和缺点

  • 简单好用,捕获信号常用;
  • 绑定处理函数的这种方式,使用signal时,不同版本可能不同。
  • 无法简单直接得知之前设置的对信号的处理方法。


2、sigaction函数介绍





(1)两个都是API,但sigaction比signal更具有可移植性

  • sigaction可以单独设置新的捕获,或者单独只获取旧的捕获函数(将新的传参为NULL);
  • signal函数不能单独获取旧的捕获函数,必须设置新的捕获函数,传参后函数返回才获取旧的捕获函数。

(2)用法关键是2个sigaction指针