首页 > 其他分享 >signal.h详解

signal.h详解

时间:2025-01-18 12:45:20浏览次数:1  
标签:__ int signal 详解 sig void define

C 库函数 - signal()

来自 C 库函数 – signal() | 菜鸟教程

描述

C 库函数 void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序。

signal 函数是 C 标准库中的一个函数,用于设置信号处理程序。该函数定义在 <signal.h> 头文件中。signal 函数允许程序定义当某些信号(如 SIGINT,由按下 Ctrl+C 产生)到达时要执行的处理程序。

声明

下面是 signal() 函数的声明。

void (*signal(int sig, void (*func)(int)))(int);

解释一下该函数的申明怎么读,后面附带的两个(int)的意思是:该符号前的函数指针所对应的函数是带一个 int 类型的参数的。比如最外面的,是说 signal 返回的函数指针所对应的函数是带 int 的参数的;里面的,作为参数的函数名是带一个 int 参数的。

中间部分:

signal( int sig, void (*func)(int))

signal 函数有 2 个参数,第一个是 int,第二个是无返回值,带一个 int 参数的函数指针

外围:

void   (*signal(xxx))   (int)

signal 函数返回的是一个函数指针,无返回值,有一个 int 参数

简化:

typedef void Sigfunc(int)

Sigfunc 就代表的就是一个 返回值是一个无返回值,有一个 int 参数的函数。

最后就成了这样:

Sigfunc *signal(int, Sigfunc*)

参数

  • sig -- 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:
信号
SIGABRT (Signal Abort) 程序异常终止。
SIGFPE (Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。
SIGILL (Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。
SIGINT (Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。
SIGSEGV (Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。
SIGTERM (Signal Terminate) 发送给本程序的终止请求信号。
  • func -- 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一:
SIG_DFL 默认的信号处理程序。
SIG_IGN 忽视信号。

返回值

该函数返回信号处理程序之前的值,当发生错误时返回 SIG_ERR。

实例

下面的实例演示了 signal() 函数的用法。

实例

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sighandler(int);

int main()
{
   signal(SIGINT, sighandler);

   while(1)
   {
      printf("开始休眠一秒钟...\n");
      sleep(1);
   }

   return(0);
}

void sighandler(int signum)
{
   printf("捕获信号 %d,跳出...\n", signum);
   exit(1);
}

让我们编译并运行上面的程序,这将产生以下结果,且程序会进入无限循环,需使用 CTRL + C 键跳出程序。

开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
捕获信号 2,跳出...

signal.h:

/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_SIGNAL
#define _INC_SIGNAL

#include <crtdefs.h>
#include <pthread_signal.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _SIG_ATOMIC_T_DEFINED
#define _SIG_ATOMIC_T_DEFINED
  typedef int sig_atomic_t;
#endif

#define NSIG 23

#define SIGINT 2
#define SIGILL 4
#define SIGABRT_COMPAT 6
#define SIGFPE 8
#define SIGSEGV 11
#define SIGTERM 15
#define SIGBREAK 21
#define SIGABRT 22       /* used by abort, replace SIGIOT in the future */
#define SIGABRT2 22

#ifdef _POSIX
#define	SIGHUP	1	/* hangup */
#define	SIGQUIT	3	/* quit */
#define	SIGTRAP	5	/* trace trap (not reset when caught) */
#define SIGIOT  6       /* IOT instruction */
#define	SIGEMT	7	/* EMT instruction */
#define	SIGKILL	9	/* kill (cannot be caught or ignored) */
#define	SIGBUS	10	/* bus error */
#define	SIGSYS	12	/* bad argument to system call */
#define	SIGPIPE	13	/* write on a pipe with no one to read it */
#ifdef __USE_MINGW_ALARM
#define	SIGALRM	14	/* alarm clock */
#endif
#endif

  typedef	void (*__p_sig_fn_t)(int);

#define SIG_DFL (__p_sig_fn_t)0
#define SIG_IGN (__p_sig_fn_t)1
#define SIG_GET (__p_sig_fn_t)2
#define SIG_SGE (__p_sig_fn_t)3
#define SIG_ACK (__p_sig_fn_t)4
#define SIG_ERR (__p_sig_fn_t)-1

  extern void **__cdecl __pxcptinfoptrs(void);
#define _pxcptinfoptrs (*__pxcptinfoptrs())

  __p_sig_fn_t __cdecl signal(int _SigNum,__p_sig_fn_t _Func);
  int __cdecl raise(int _SigNum);

#ifdef __cplusplus
}
#endif
#endif

标签:__,int,signal,详解,sig,void,define
From: https://www.cnblogs.com/T0fV404/p/18674788

相关文章

  • 详解ppo算法
    详解ppo算法GPT-4oPoePPO(ProximalPolicyOptimization,近端策略优化)是深度强化学习中一种高效、稳定的策略优化算法,由OpenAI于2017年提出。PPO在策略梯度方法上进行了改进,结合了策略优化和信任域约束,使得训练更加稳定且易于实现。以下是对PPO算法的详细解读,包括背......
  • 深入理解 Linux systemd 单元类型及配置详解
    深入理解Linuxsystemd单元类型及配置详解在Linux系统中,systemd是一种强大的初始化系统和服务管理工具,它通过**单元(Unit)**来管理服务、文件系统、设备等。systemd支持多种单元类型,如服务单元(.service)、目标单元(.target)、挂载单元(.mount)、设备单元(.device)、计时单元(.t......
  • Java数组详解
    目录一、什么是数组二、声明和创建1、数组的声明2、数组的创建三、数组的初始化1.静态初始化(StaticInitialization)2.动态初始化(DynamicInitialization)3.默认初始化(DefaultInitialization)四、数组的基本使用1、访问元素2、数组长度3、遍历数组五、数组下......
  • Vue3中使用组合式API通过路由传值详解
    在Vue3中,使用组合式API来传递路由参数是一种常见的需求。VueRouter是Vue.js的官方路由管理工具,可以在不同的场景下通过多种方式传递和接收路由参数。下面将详细讲解几种常见的路由传值方式,并提供相应的代码示例。1.通过路由参数传值(动态路由参数)路由参数是一种最常......
  • Prometheus中Sample(样本)与Series(序列)的区别详解
    Prometheus中Sample(样本)与Series(序列)的区别详解 在Prometheus这一强大的开源监控和警报系统中,Sample(样本)与Series(序列)是两个核心概念,它们在数据模型和数据处理流程中扮演着至关重要的角色。本文将详细探讨这两个概念的定义、组成、作用以及它们之间的区别。一、Sample(样本)1.1......
  • linux内核态线程详解
    头文件:#include <linux/sched.h>     //wake_up_process()    #include <linux/kthread.h>   //kthread_create()、kthread_run()  #include <err.h>           //IS_ERR()、PTR_ERR()1.创建并启动一个内核线程:方式一:s......
  • Java 17 新特性详解与代码示例
    ......
  • 【详解】Redis配置文件详解
    目录Redis配置文件详解1.基本配置1.1绑定地址1.2端口号1.3守护进程模式1.4日志级别1.5日志文件路径2.数据持久化2.1RDB快照2.2AOF日志3.内存管理3.1最大内存限制3.2淘汰策略4.安全配置4.1密码认证4.2访问控制5.高级配置5.1集群模式5.2主......
  • 【详解】Hive怎样写exist/in子句
    目录Hive怎样写exist/in子句1.EXISTS子句示例2.IN子句示例3.EXISTSvsIN示例场景使用​​EXISTS​​子句示例1:查找有订单的客户使用​​IN​​子句示例2:查找有订单的客户性能考虑示例3:查找没有订单的客户使用​​NOTEXISTS​​使用​​NOTIN​......
  • Camel-AI项目模块详解
    前提内容快捷键在Pycharm中使用ctrl+F12查看类中所有方法查看某一个类中的方法的实现类:鼠标点到方法名字上右键→goto→Implementationscamel项目目录如下:camel/├──agents/#智能体相关代码├──models/#模型集成与管理├......