Linux signal()函数的使用学习

 更新时间:2023年05月14日 11:12:37   作者:chnmagnus  
这篇文章主要为大家介绍了Linux signal()函数的使用学习及示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

signal() 函数

无意中看到了 signal() 函数,感觉对这个函数的原型有诸多疑惑,学习一下,顺便分享。

1. 原型

Unix系统提供了signal()和sigaction()两个函数来改变对于信号的处理方法。其中signal()是一个基于sigaction()系统调用的glibc库函数,其行为在不同的Unix操作系统存在差异,对于可移植性有要求的程序不能使用signal()函数。

其原型如下:

#include<signal.h>
void ( *signal(int sig, void (*handler)(int)) )(int);

signal函数的第一个参数sig,要传入希望修改处理函数的信号编号,第二个参数,是一个无返回值、接受一个int形参的函数指针,指向对sig信号的新处理函数。函数的第二个参数可以有三种选择,第一种是我们自己定义的信号处理函数,第二种是传入SIG_DFL 表示将之前signal所改变的信号处理方式还原,第三种是传入SIG_IGN,表示处理方式为忽略该信号,内核会直接将信号丢弃,不会传递到进程。

signal函数的返回值同样是一个无返回值、接受一个int形参的函数指针。当signal()函数成功执行时,返回值是执行signal函数之前的sig信号的处理函数的指针,如果失败,则返回SIG_ERR。

对信号处理函数指针做这样的定义,可能便于理解:

//将sighandler_t定义为返回值为void,接受一个int形参的函数的指针
typedef void (*sighandler_t)(int);
//现在我们可以这样书写signal函数
sighandler_t signal(int sig, sighandler_t handler);

其实glibc里已经有了如上的定义,只需要我们定义_GUN_SOURCE特性测试宏,就可以使用sighandler_t类型。

2.实例

以下用法用于暂时性修改某信号的信号处理函数,在使用完之后,将信号处理函数重置为其原来版本。

void newhandler(int sig){
    //code to handle the sig
}
void (*prevhandler)(int); //存储修改之前的信号处理函数
prehandler = signal(SIGINT, newhandler);
if(prehandler == SIG_ERR)  
    cerr<<"Error in signal"<<endl;
/*现在,对于中断信号的处理已经修改为我们定义的newhandler函数*/
if(signal(SIGINT, prevhandler) == SIG_ERR)
    cerr<<"Error in signal"<<endl;

以上就是Linux signal()函数的使用学习的详细内容,更多关于Linux signal函数的资料请关注脚本之家其它相关文章!

相关文章

  • Linux下JDK中文字体乱码的解决方法

    Linux下JDK中文字体乱码的解决方法

    下面小编就为大家带来一篇Linux下JDK中文字体乱码的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • shell中case的用法学习笔记

    shell中case的用法学习笔记

    这篇文章主要为大家介绍shell中的case语句:可以把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码
    2013-11-11
  • 在shell或者perl中改变字体或背景的颜色

    在shell或者perl中改变字体或背景的颜色

    有时候在运行别人写的脚本的时候,在黑乎乎的终端下显示了不同的颜色,好生的羡慕啊,今天就来分享一下,分别在shell和perl中怎么改变我们输出的字体的颜色
    2014-04-04
  • Linux shell知识点汇总

    Linux shell知识点汇总

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。
    2015-08-08
  • Shell多线程操作及线程数控制实例

    Shell多线程操作及线程数控制实例

    这篇文章主要介绍了Shell多线程操作及线程数控制实例,文中从单线程实现一个需求开始,不断加入代码实现多线程以及线程数的控制功能,需要的朋友可以参考下
    2014-07-07
  • linux 中vim的用法讲解

    linux 中vim的用法讲解

    Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,而 gVim 则是其 Windows 版。这篇文章主要介绍了linux 中vim的用法讲解的相关资料,需要的朋友可以参考下
    2016-10-10
  • 详解sed -i 命令入门教程

    详解sed -i 命令入门教程

    这篇文章主要介绍了sed -i 命令入门教程,sed 本身是一个非常复杂的工具,有专门的书籍讲解 sed 的具体用法,网上也有很多关于 sed 的教程,我也是抱着学习的心态来学习 sed 的常见的用法,并进行系统的总结,内容基本覆盖了 sed 的大部分的知识点
    2022-06-06
  • Linux全网最全面常用命令整理(附实例)

    Linux全网最全面常用命令整理(附实例)

    这篇文章主要介绍了Linux命令,是目前最全面的集合,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • linux中kvm的安装及快照管理

    linux中kvm的安装及快照管理

    这篇文章主要介绍了linux中kvm的安装及快照管理的相关资料,需要的朋友可以参考下
    2016-12-12
  • shell脚本中使用return和exit的方法

    shell脚本中使用return和exit的方法

    return和exit各有用途,合理使用可以使shell编程更规范可控,return是一个关键字, exit是一个函数,这篇文章主要介绍了shell脚本之如使用return和exit,需要的朋友可以参考下
    2023-08-08

最新评论