理解UNIX系统的signal函数的定义

unix signal unix signal info list of unix maybe useful 立即下载

读《 unix 环境高级编程》信号机制一章,遇到 signal 函数:

#include<signal.h>

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

返回值:成功返回信号以前的处理配置,出错返回 SIG_ERR.

 

这个定义比较复杂,按照“右左法则”来理解:

“ 右左法则 ”[ 重要!!! ]

The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

这是一个简单的法则,但能让你准确理解所有的声明。这个法则运用如下:从最内部的括号开始阅读声明,向右看,然后向左看。当你碰到一个括号时就调转阅读的方向。括号内的所有内容都分析完毕就跳出括号的范围。这样继续,直到整个声明都被分析完毕。对上述 “ 右左法则 ” 做一个小小的修正:当你第一次开始阅读声明的时候,你必须从变量名开始,而不是从最内部的括号。

 

像 signal 函数,阅读步骤:

  1. 从 func 开始 -----------------------------------------------func
  2. 向右看碰到)因此向左看碰到一个 *-------------------------- 一个指针
  3. 跳出括号,碰到( int ) --------------------------------------------------------- 一个带一个 int 类型参数的函数
  4. 向左看, int signo , ------------------------------------------------------------ 又一个 int 类型的参数
  5. 红色部分处理完跳出括号向右看遇到)向左遇到 *-------------------- ( signal 函数)返回一个指针
  6. 粗体部分看完了跳出向右遇到( int ) -------------------------------------- 一个带 int 类型参数的函数
  7. 向左看发现 void-------------------------------------------------------------------void 类型, signal 函数返回的指针指向一个参数为 int类型,返回值为 void 类型的函数。

 

可以理解为 signal 函数的参数有两个,一个是 int 类型,一个是一个函数指针(参数类型为 int ,返回值为 void ),返回值为一个函数指针(参数类型为 int ,返回值为 void )。

因此按照书中的解释,如果使用 typedef 更好理解一些:

typedef  void SigFunc ( int );   // 声明一个类型,该类型为函数且有一个 int 参数并且返回值为 void 型。

则 signal 函数可以简写为:

SigFunc * signal ( int , SigFunc* );

 

关于理解复杂的 c++ 声明,这上面的左右法则是从 http://buaadallas.blog.51cto.com/399160/80947 学来的,上面有几个更复杂的声明:

下面结合例子来演示一下 “ 右左法则 ” 的使用。 

int * (* (*fp1) (int) ) [10];

阅读步骤: 
1. 
从变量名开始 -------------------------------------------- fp1
2. 
往右看,什么也没有,碰到了 ) ,因此往左看,碰到一个 * ------ 一个指针 
3. 
跳出括号,碰到了 (int) ----------------------------------- 一个带一个 int 参数的函数 
4. 
向左看,发现一个 * --------------------------------------- (函数)返回一个指针 
5. 
跳出括号,向右看,碰到 [10] ------------------------------ 一个 10 元素的数组 
6. 
向左看,发现一个 * --------------------------------------- 指针 
7. 
向左看,发现 int ----------------------------------------- int 类型 


总结: fp1 被声明成为一个函数的指针 , 该函数返回指向指针数组的指针 .


再来看一个例子: 

int *( *( *arr[5])())();

阅读步骤: 
1. 
从变量名开始 -------------------------------------------- arr
2. 
往右看,发现是一个数组 ---------------------------------- 一个 5 元素的数组 
3. 
向左看,发现一个 * --------------------------------------- 指针 
4. 
跳出括号,向右看,发现 () -------------------------------- 不带参数的函数 
5. 
向左看,碰到 * ------------------------------------------- (函数)返回一个指针 
6. 
跳出括号,向右发现 () ------------------------------------ 不带参数的函数 
7. 
向左,发现 * --------------------------------------------- (函数)返回一个指针 
8. 
继续向左,发现 int --------------------------------------- int 类型 

//arr is an array of 5 pointers to functions 
//that take no arguments and return pointers to 
//functions having no arguments and having int type as return value. 

还有更多的例子: 

float ( * ( *b()) [] )();     // b is a function that returns a
            // pointer to an array of pointers
            // to functions returning floats.

void * ( *c) ( char, int (*)());   // c is a pointer to a function that takes
            // two parameters:
            //   a char and a pointer to a
            //   function that takes no
            //   parameters and returns
            //   an int
            // and returns a pointer to void.

void ** (*d) (int &, char **(*)(char *, char **));   // d is a pointer to a function that takes
            // two parameters:
            //   a reference to an int and a pointer
            //   to a function that takes two parameters:
            //   a pointer to a char and a pointer
            //   to a pointer to a char
            //   and returns a pointer to a pointer
            //   to a char
            // and returns a pointer to a pointer to void

float ( * ( * e[10]) (int &) ) [5];      

            // e is an array of 10 pointers to
            // functions that take a single
            // reference to an int as an argument
            // and return pointers to
            // an array of 5 floats.本文出自 技术博客 
    

=============================================================================

本文转自 http://standalone.iteye.com/blog/431920

FineReport实战-- 国内外各地区销售数据分析 多个图表联动 进行国内外各地区业务员销售数据分析是一项复杂但极具价值的任务,它可以帮助企业了解不同市场的表现,并据此调整销售策略以提高整体绩效。实现功能:同一个报表里面多个图表联动问题。 阅读详情

相关推荐

手把手教你用单结晶体管搭建简易振荡电路(含电路图和波形分析)

本文详细介绍了如何使用单结晶体管(UJT)搭建简易振荡电路,包括电路设计、波形分析和实战技巧。通过具体的电路图和参数计算,帮助电子爱好者和工程师快速掌握UJT振荡器的设计与调试方法,适用于脉冲信号生成和时钟源制作等应用场景。

weixin_29207533的博客 516

Unix信号详解(Signal的信号说明)

signal信号机制是属于计算机异常处理机制中的一种。 signal信号属于一种异步处理异常的机制之一。 类似于我们平常在命令行上对于死循环的程序,按下ctrl-z暂时挂起,ctrl-c程序终止,这些挂起,终止信号都属于signal信号的一种,常见的几种signal信号如下图所示(供查询使用,平时并无用): 信号常见的术语: 1.发送信号: 先简单介绍一下进程组的概念,一个操作系统有很多进

写代码的柯长的博客 7963

多智能体强化学习中的Trust Region技术:HATRPO与HAPPO深度解析

本文深度解析多智能体强化学习中的Trust Region技术,重点探讨HATRPO(异质智能体信任区域策略优化)与HAPPO(异质智能体近端策略优化)两种先进算法。通过数学架构与工程实现细节,揭示其在解决联合策略空间爆炸、信用分配等挑战中的优势,并分享实际部署中的优化技巧与前沿进展。

weixin_29072299的博客 191

UNIX常用文件函数使用指南

常用的标准C库文件操作函数

Andy_19980816的博客 529

从报错到定位:Memtest86 DQ位算法解析与实践指南

本文深入解析了Memtest86内存测试工具报错信息的解读方法,重点介绍了通过地址解析、数据转换、位比对和DQ定位四步算法,精准锁定故障DQ位的实践流程。文章以DDR4和DDR5为例,详细拆解了从十六进制报错到二进制比对的完整步骤,并提供了从单个报错分析到故障模式诊断的进阶指南,帮助用户将抽象的报错信息转化为具体的维修或排查依据。

sre5engineer的博客 486

别再死记硬背了!用Amesim HCD库亲手搭建单向阀、锥阀、球阀模型(附详细参数设置)

本文详细介绍了如何使用Amesim HCD库从零构建单向阀、锥阀和球阀的仿真模型,帮助工程师摆脱死记硬背,掌握物理建模的核心技巧。通过实战案例和参数设置指南,读者将学会如何优化阀门动态响应、验证流量特性以及处理旋转运动等独特挑战,提升液压系统设计效率。

weixin_29248611的博客 501

Signal ()函数详细介绍

signal()函数理解 在 这个头文件中。 signal(参数1,参数2); 参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。 参数2:我们处理的方式(是系统默认还是忽略还是捕获)。 一般有3中方式进行操作。 (1)eg: signal(SIGINT ,SIG_ING ); //SI

沉淀 1765

瑞芯微rv1126 rtsp+mpp+rga取流

瑞芯微rv1109 rtsp+mpp+rga取流

ZuoSeDiao的博客 6339

UNIX环境编程之信号处理

一、基本概念 1.中断 中止(并非终止)当前正在执行的程序,转而执行其他任务 2.信号是一种软件中断 信号提供了一种以异步方式执行任务的机制 3.常见信号 SIGHUP(1) 链接断开信号 SIGINT(2) 终端终端符信号 SIGQUIT(3) 终端退出符信号 SIGKILL(9) 终止信号 SIGTSTP(20) 终端停止符信号 4.不可靠信号(非实时信号) 小于SIGRTMIN(34)的信号都是不可靠信号 不支持排队,可能会丢失 5.可靠信号(实时信号) 位于SIGRTMIN(34),SIGR

m0_53536818的博客 306

Visual Studio 6.0 镜像下载全指南:从企业版到中文版

本文提供Visual Studio 6.0企业版和中文版的镜像下载全指南,包括详细版本解析、已验证的下载链接及校验信息。针对现代系统的安装技巧和兼容性处理方案,帮助开发者高效获取并运行这一经典开发工具,特别适合维护遗留系统的专业人员。

weixin_33712987的博客 1048

Aider的Repo Map功能

要把整个项目的所有文件添加到 Repo Map 中,需要调整 Aider 的行为,让它扫描整个代码库并将所有文件纳入 Repo Map。在使用 Aider 时,Repo Map 默认只包含当前会话中明确指定的文件(通过命令行传入的。通过命令行将整个项目的文件列表传递给 Aider,使其初始化时包含所有文件。,让 Aider 在初始化时自动加载整个项目的文件到。如果你的项目是 Git 仓库,Aider 可以通过。在 Aider 的交互模式中,手动添加整个项目文件。,从而生成包含所有文件的 Repo Map。

qq_41638872的博客 1638

理解signal函数

关键字:Unix , Linux, signal, 函数指针,指针函数在Unix/Linux中signal函数是比较复杂的一个,其定义原型如下:void (*signal(int signo,void (*func)(int))) (int)这个函数中,最外层的函数体void (* XXX )(int)表明是一个指针,指向一个函数XXX的指针,XXX所代表的函数需要一个int型的参

心路历程 8404

Veritas NetBackup8.1.1客户端安装

1.在客户机打开安装包运行Browser 2.选择NetBackup Client Software Installation 3.下一步 4.接受,下一步 5.我选择自定义安装,下一步 6.我选择安装到D盘 7.默认下一步 8.使用域管理账户 9.输入服务器安装了服务端的那一台名称 10.输入服务端生成的令牌,选择“I recognize the fingerprint for this host.Proceed with the certificate deploymen”下一步

万物皆可学 2万+

UNIX下C语言编程与实践38-UNIX 信号操作:signal 函数与信号捕获函数的编写

本文介绍了UNIX信号处理的核心函数signal及其增强替代方案sigaction。signal函数作为基础接口,可实现信号的默认处理、忽略和捕获三种核心功能,但存在兼容性差、不支持信号掩码等局限性。文章详细解析了signal函数的参数规范、返回值处理,并通过实例演示了三种典型使用场景。重点强调了信号捕获函数的编写规范,包括禁止调用不可重入函数、使用volatile修饰全局变量等关键注意事项。针对复杂场景,推荐使用sigaction函数,其支持信号掩码、自动重启系统调用和获取信号附加信息等增强功能

文石_2009的博客 946

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Unix中Signal信号的不同

Unix系统signal函数的不同 (1)函数说明 在signal函数中,有两个形参,分别代表需要处理的信号编号值和处理信号函数的指针。它主要是用于前32种非实时信号的处理,不支持信号的传递信息。但是由于使用简单,易于理解,因此在许多场合被程序员使用。 对于Unix系统来说,使用signal函数时,自定义处理信号函数执行一次后失效,对该信号的处理回到默认处理方式。下面以一个例子进行说明...

连城 253

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Unix:signal调用类成员函数 / Linux:signal调用类成员函数

这个问题早在使用signal时就碰到过,好不容易找到signal使用static型类成员函数的方法,但是发现不能传递参数,终究还是不行,直到在《APUE》上看到pthread和signal这一节,找到sigwait这个工具,这个问题总算是得到解决。 **************************************************************************

guoduhua的专栏 1691

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)

文章目录描述声明参数返回值实例附加解释 描述 C 库函数 void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序。 声明 下面是 signal() 函数的声明。 void (*signal(int sig, void (*func)(int)))(int) 参数 sig – 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量: func – 一个指向函数的指针。它可以是一个由程序定义的函

Dontla的博客 9100

013_C标准库函数之<signal.h>

还是说就直接终止了呢?关于信号的应用及扩展,在Linux中有大量的描述,以及sigaction等功能强大的函数,这个有兴趣的可以去看看,后面我们也会在Liunx C模块中去讲解这些,当然了,本人还是觉得先把C的这些搞清楚,因为linux C是在C的基础之上去搞的,切勿好高骛远哦,一步步来,加油,一起共勉。),其实就是准备捕获的信号的参数由sig给出,接收到的指定信号后要调用的函数由参数handle给出,接下来再看外面的函数:我们把signal看作一个整体T,外面的函数形式就是void (*T)(int);

qq_47325567的博客 1123

Python信号处理函数 (signal)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @[Python 信号处理函数 (signal)](文章Python模块之信号(signal) 在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windows内核中由于对信号机制的支持不充

weixin_44573243的博客 1万+

unix系统中的信号是什么?

接收unxi系统中信号相关的概念

weixin_48344581的博客 638

signal-hook与signal-hook-registry:理解Rust信号处理库的架构设计

signal-hook是一个功能强大的Rust库,允许为同一个信号注册多个处理程序,解决了Unix信号处理中的诸多痛点。本文将深入解析signal-hook及其底层组件signal-hook-registry的架构设计,帮助开发者理解它们如何协同工作,以及如何在实际项目中有效利用这两个库。 ## 信号处理的挑战与解决方案 Unix信号处理本质上具有挑战性,主要体现在三个方面:全局资源竞争、线程

gitblog_00826的博客 330

linux 信号signal和sigaction理解

今天看到unp时发现之前对signal到理解实在浅显,今天拿来单独学习讨论下。 signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,简单给出个函数例子如下: 1 #include 2 #include 3 #include 4 5 void ouch(int sig) 6 { 7

简单生活 4万+
上一篇: pdf merge for code one
下一篇: Java关键字final、static使用总结
Open9i
博客等级 码龄16年 14粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值