分享

signal函数详细用法

 XeonGate 2019-10-24


信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断


信号和中断的区别

信号与中断的相似点:

(1)采用了相同的异步通信方式;

(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;

(3)都在处理完毕后返回到原来的断点;

(4)对信号或中断都可进行屏蔽。

 信号与中断的区别:

(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;

(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;

(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。

SIGABRT  进程停止运行 6

SIGINT      终端中断  2

SIGKILL     停止进程(此信号不能被忽略或捕获)

SIGQUIT   终端退出   3

 handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void,

handler也可以是下面两个特殊值:

                              SIG_IGN     屏蔽该信号

                              SIG_DFL     恢复默认行为

/*
       #include <signal.h>
       typedef void (*sighandler_t)(int);
       sighandler_t signal(int signum, sighandler_t handler);
*/

signal的函数原型,这里要注意它的返回值的类型,

它的参数,第一个是信号的编号,也就是具体是哪一个信号,固定的写法,没什么好说的,

第二个参数handler,

1, 赋值SIG_IGN代表忽略信号,

2,或者你可以自己写个信号处理函数,传给它地址,

3,如果你需要修改上面的设置,可以恢复默认SIG_DFL ,

下面是一个自己写的信号处理函数,

说两点,

1,默认自带一个int类型参数,//开始还在找,这个num哪里传进去的,

2,返回类型是void,

  1. void handler(int num)
  2. {
  3. printf("recv num:%d \n", num);
  4. if (num == SIGQUIT)
  5. {
  6. //exit(0);
  7. }
  8. }


下面是signal返回值的应用场景,

  1. if (signal(SIGINT, handler) == SIG_ERR)
  2. {
  3. perror("signal err"); //errno
  4. exit(0);
  5. }
     这是它的返回  typedef void (*sighandler_t)(int);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多