首页 > 其他分享 >9.2.2 信号函数signal详解

9.2.2 信号函数signal详解

时间:2022-09-18 18:44:46浏览次数:55  
标签:函数 int signal handler 9.2 include void 详解

信号处理函数的定义为:

void signal_handler(int signum)

可以理解为:参数为int型,返回值为void型的函数;

信号函数signal()定义如下:

void ( *signal( int signum,void (*handler)(int) ) ) (int);
signum :信号值;
handler:针对信号值定义的信号处理函数

该函数可以理解为:

1.最外层:void (*signal() ) (int),这是一个指向参数为int,返回值为void型的函数指针,该函数指针又是一个signal函数的返回值,即signal函数执行后,返回一个void (*)(int)的函数指针;

2.signal函数:该函数是带两个参数的函数,第一个参数为int型的信号值,第二个参数为指向用户定义的信号处理函数的指针。对比上面最外层的返回值类型,其指向的函数就是signal的第二个参数指向的函数。总体理解为signal内部把信号signum传递给信号处理函数handler,然后signal函数返回指针,就指向信号处理函数handler,最后开始执行handler。

对比上述两个函数指针指向的函数类型和信号处理函数定义类型,二者相同,即函数指针都是指向信号处理函数的。

书中使用了typedef简化函数指针表达:

先看一个typedef定义函数指针类型的例子:

typedef int (*pointer) (int)

可以理解为 pointer等价于int (*)(int),声明pointer p 就等价于int (*p1)(int)。 

接下来:使用typedef定义void (*)(int):

typedef void (*sighandler_t) (int);
sighandler_t signal(int signum,sighandler_t handler);

 示例操作:

  • signal——test1.c:按下CTRL+C,发出SIGINT信号
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>

void sigterm_handler(int sig){
  printf("Have caught sig N.O. %d\n",sig);
  exit(0);      
}
int main(){
  signal(SIGINT,sigterm_handler) ;/*按下CTRL+C将向其发出SIGINT信号*/
  while(1);
  return 0; 
}

 

 

 

使用gcc signal_test1.c -o signal_test1 生成可执行文件,./signal_test1执行文件:

 

 

观察到 信号值为2。

  •  signal——signal_test2.c : 异步通知的例子:
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<signal.h>
#include<fcntl.h>
#include<unistd.h>

#define MAX_LEN 100
void input_handler(int num){
  char data[MAX_LEN];
  int len;
 /*read and printf data from input of STDIN_FILENO*/
  len = read(STDIN_FILENO,&data,MAX_LEN);
data[len]= 0;/*字符串结束标志*/ printf("input available: &s\n",data); } int main(){ int oflags; signal(SIGIO,input_handler);/*为SIGIO信号安装input——handler驱动*/ fcntl(STDIN_FILENO,F_SETOWN,getpid());/*本进程为STDIN_FILENO文件的拥有者,内核将信号发送给本进程*/ oflags = fcntl(STDIN_FILENO,F_GETFL);/*启用异步通知机制-对设备设置FASYNC标志*/ fcntl(STDIN_FILENO,F_SETFL, oflags | FASYNC); }

使用命令 gcc signal_test2.c -o signal_test2 ; ./signal_test2 

 

 异步通知理解:

(1)通过F_SETOWN 这个io控制命令设置设备文件的拥有者为本进程,这样从设备驱动发出的信号才能被本进程接收到。

(2)通过F_SETFL 控制命令设置设备文件支持FASYNC,即异步通知模式。

(3)通过signal()函数连接信号和信号处理函数。

标签:函数,int,signal,handler,9.2,include,void,详解
From: https://www.cnblogs.com/xuan01/p/16704338.html

相关文章

  • [AXI4 专题] response signaling AXI4中的响应信号与对应控制
    [AXI4专题]responsesignalingAXI4中的响应信号与对应控制AXI4响应信号类型RRESPandBRESPsignalis2bitlength,whichisindicatingofb00:OKAYresponse......
  • 深入剖析Java虚拟机:源码剖析与实例详解(基础卷) pdf
    高清扫描版下载链接:https://pan.baidu.com/s/10P_9A-09hqKl-2Y1tLJIoA点击这里获取提取码 ......
  • MySQL数据备份 mysqldump 详解
    MySQL数据备份流程1打开cmd窗口通过命令进行数据备份与恢复;需要在Windows的命令行窗口中进行;l 开始菜单,在运行中输入cmd回车;l 或者win+R,然后输入cmd回车,即......
  • MySQL EXPLAIN详解
    Explain简介本文主要讲述如何通过explain命令获取select语句的执行计划,通过explain我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引......
  • Monitor(管程/监视器)详解
    说明Monitor,直译为“监视器”,而操作系统领域一般翻译为“管程”。管程是指管理共享变量以及对共享变量操作的过程,让它们支持并发。在Java1.5之前,Java语言提供的唯一......
  • PyTorch 中RNN,LSTM,GRU使用详解
    来张图说明一下 RNNCellnn.RNNCell(input_size,hidden_size,bias=True,nonlinearity=‘tanh’)h′=tanh(Wih​x+bih​+Whh​h+bhh​)input_size:输入......
  • 介绍 Preact Signals
    1.什么是Signals?Signals是用来处理状态的一种方式,它参考自SolidJS,吸收了其大部分的优点。无论应用多么复杂,它都能保证快速响应。Signals的独特之处在于状态更改会以......
  • mysql的binlog,MySQL日志详解
    什么是binlogbinlog介绍-芹溪-博客园(cnblogs.com) mysql的binlog开启方式,查看方式.三种binlog模式介绍.以及使用binlog恢复数据.删除binlog(75条消息)MySQL日......
  • mysql中find_in_set()函数的使用及in()用法详解
    这篇文章主要介绍了mysql中find_in_set()函数的使用以及in()用法详解,需要的朋友可以参考下 MySQL手册中find_in_set函数的语法解释:FIND_IN_SET(str,strlist)str要......
  • 【原创】K8S环境下研发如何本地调试?kt-connect使用详解
    K8S环境下研发如何本地调试?kt-connect使用详解背景注:背景有点啰嗦,讲讲一路走来研发本地调试的变化,嫌烦的可以直接跳过,不影响阅读。2019年我在的公司当时是个什么情况,只......