Linux signal()函数的使用学习

2023-12-05 0 166
目录
  • signal() 函数
    • 1. 原型
    • 2.实例

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;

以上就是Linuxsignal()函数的使用学习的详细内容,更多关于Linuxsignal函数的资料请关注悠久资源网其它相关文章!

您可能感兴趣的文章:

  • Linux 新的API signalfd、timerfd、eventfd使用说明
  • linux驱动开发中常用函数copy_from_user open read write详解
  • linux下用time(NULL)函数和localtime()获取当前时间的方法
  • Linux unlink函数和删除文件的操作方法
  • Linux lseek函数的使用详解

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 linux shell Linux signal()函数的使用学习 https://www.u-9.cn/jiaoben/linuxshell/101548.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务