- 浏览: 614435 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
月光杯:
问题解决了吗?
Exceptions in HDFS -
iostreamin:
神,好厉害,这是我找到的唯一可以ac的Java代码,厉害。
[leetcode] word ladder II -
standalone:
One answer I agree with:引用Whene ...
How many string objects are created? -
DiaoCow:
不错!,一开始对这些确实容易犯迷糊
erlang中的冒号 分号 和 句号 -
standalone:
Exception in thread "main& ...
one java interview question
读《 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 函数,阅读步骤:
- 从 func 开始 -----------------------------------------------func
- 向右看碰到)因此向左看碰到一个 *-------------------------- 一个指针
- 跳出括号,碰到( int ) --------------------------------------------------------- 一个带一个 int 类型参数的函数
- 向左看, int signo , ------------------------------------------------------------ 又一个 int 类型的参数
- 红色部分处理完跳出括号向右看遇到)向左遇到 *-------------------- ( signal 函数)返回一个指针
- 粗体部分看完了跳出向右遇到( int ) -------------------------------------- 一个带 int 类型参数的函数
- 向左看发现 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.本文出自
51CTO.COM
技术博客
发表评论
-
std::map
2017-08-06 22:41 630std::map<char,int> my ... -
lost on Py_DECREF/INCREF when handling PyList_Append in Python C extension
2015-11-03 21:41 1064The main hint is in the docs, i ... -
An Example of Using std::tr1::bind
2014-03-10 16:49 1524#include <iostream> #i ... -
c++中的virtual inheritance
2014-01-27 10:20 806http://stackoverflow.com/questi ... -
Java的Generics和c++的Template到底有什么不同?
2012-12-27 16:21 3334先了解Java的Generics: 根据Java的文档,Jav ... -
Calculating Permutations and Job Interview Questions
2011-06-18 17:44 958http://www.bearcave.com/random_ ... -
字符串指针、字符数组的sizeof和strlen结果
2010-09-27 08:36 1465int main(){ char *p1=" ... -
code snippet
2010-09-27 08:31 930char temp[3]; char temp2[3]; ... -
虚继承
2010-09-26 09:03 970http://www.cppblog.com/franksun ... -
调整堆的算法
2010-09-25 10:34 1144Begin adjustHeap(A[], i) // He ... -
multiset usage as heap
2010-09-24 21:37 1450Middle number There is a seque ... -
虚函数表又是怎样实现的?
2010-09-20 22:01 1321每个含有虚函数的类 ... -
正整数分解算法
2010-09-19 16:56 4039问题:将以正整数n表 ... -
异或运算法则
2010-09-14 09:47 22001. a ^ b = b ^ a 2 ... -
常量字符串为什么位于静态存储区
2010-09-13 22:41 1262http://hi.baidu.com/%D0%C7%BB%F ... -
errno.h
2010-08-10 08:46 1519查看错误代码errno是调试程序的一个重要方法。当linuc ... -
How to use fallocate system call
2010-08-07 22:19 3432/* * fallocate - utility to u ... -
Test performance of allocating a zeroed file via various methods
2010-08-07 22:09 1107/* * Test performance of a ... -
how to reverse the word sequence in a sentence?
2010-07-06 22:01 1231For example, "Welcome ... -
c++ dynamic binding
2010-07-06 21:20 904Good tutorial about c++ dynamic ...
相关推荐
这本手册详尽地介绍了Unix系统中C语言的标准库函数,帮助开发者理解和使用这些函数,从而编写出高效、可靠的程序。以下是对其中一些关键知识点的详细阐述: 1. **标准输入输出**:在Unix系统中,C语言提供了`stdio....
理解系统调用和库函数的区别有助于优化程序性能。 七、设备驱动与I/O控制 Unix系统允许直接对硬件设备进行编程,设备驱动程序是操作系统内核的一部分,负责设备的初始化、数据传输等操作。`ioctl()`函数提供了对...
《深入理解signal函数及其在Unix/Linux系统中的应用》 在Unix和Linux系统中,`signal`函数是一个核心的系统调用,它允许程序员定义当特定的信号(Signal)发生时,程序应该如何响应。本文将详细解析`signal`函数的...
《理解Unix进程》是一本专为Web开发人员设计的Unix编程指南,旨在帮助读者深入理解Unix操作系统中的进程概念,而无需具备C语言的基础知识。这本书的超清中文版提供了清晰易读的体验,并且带有目录,方便读者快速定位...
在UNIX和LINUX操作系统中,C函数库是编程的基础,为...通过深入理解和熟练应用这些C函数库,开发者可以编写高效、可靠的UNIX/Linux程序,同时,了解和掌握这些知识点也是成为一名合格的UNIX/Linux系统程序员的基础。
`signal`系统函数是C语言中处理进程信号的关键机制,它允许程序员定义特定信号的响应方式。在Unix和类Unix操作系统中,信号是进程间通信的一种简单方式,用于通知进程某些事件的发生,如异常、用户中断或系统资源的...
- **POSIX**:Portable Operating System Interface,定义了Unix系统的一套标准,C语言函数应遵循POSIX标准以保证跨平台兼容性。 这个速查手册将涵盖以上所有方面,并可能包含更详尽的函数参数解释、返回值、错误...
Python中对信号处理的模块主要是使用signal模块,但signal主要是针对Unix系统,所以在Windows平台上Python不能很好的发挥信号处理的功能。 要查看Python中的信号量,可以使用dir(signal)来查看。 signal.signal() 在...
在IT领域,UNIX系统环境编程是一项基础且至关重要的技能,尤其对于系统开发者、软件工程师以及运维人员来说。...在实际工作中,理解并熟练运用UNIX系统环境编程,将极大地提升开发效率和代码质量。
《Linux Unix系统编程对应代码》是针对Linux和Unix操作系统进行程序开发的重要参考资料。这份资源包含了大量与系统编程相关的代码示例,旨在帮助开发者理解和实践在这些操作系统中进行底层交互的方法。下面将对其中...
12. **Shell编程**:简单介绍Bash shell脚本编写,包括常用的shell命令、条件语句、循环结构和函数定义。 这本书的内容不仅限于上述知识点,还包括更多高级主题,如线程、多进程同步、设备驱动编程等。通过阅读并...
接下来是槽函数的声明和定义。槽函数类似于普通的成员函数,但可以通过`slots:`关键字标记。槽函数可以有参数,类型可以与信号的参数匹配。例如,响应按钮点击的槽函数可能如下所示: ```cpp class MyWindow : ...
在IT领域,UNIX系统编程是构建操作系统级别...以上是UNIX系统编程的主要知识点,理解并掌握这些概念和技术,将有助于开发高效、可靠的跨平台软件。在实践中,往往需要结合实际问题选择合适的方法和工具,进行灵活应用。
通过`signal`函数,C程序可以注册信号处理函数,响应特定的系统事件,如SIGINT(用户中断)和SIGTERM(优雅关闭请求)。 八、错误处理 C语言的错误处理主要依赖于`errno`全局变量和`perror`函数。当系统调用失败时...
通过signal()和sigaction()函数,程序员可以定义信号处理函数。 6. **系统调用与库函数**:了解如何使用系统调用(如syscall())直接与内核交互,以及何时使用库函数(如open(),read())的封装,可以帮助优化性能...
Richard Stevens撰写,为程序员提供了深入理解Unix系统接口和系统调用的详细指南。在这个压缩包中包含的"apue.h"文件,是根据书中内容创建的一个头文件,它集成了书中介绍的一些常用函数原型和宏定义,方便在实际...
本教程的代码集合提供了丰富的实践素材,旨在帮助用户深入理解Unix系统编程的核心概念、工具和接口。通过这些代码示例,您可以学习如何有效地利用Unix的系统调用、库函数以及shell脚本来解决问题。 Unix系统编程...
在UNIX操作系统中,头文件(.h文件)是C编程语言中的重要组成部分,它们包含了预定义的函数声明、数据类型定义、宏以及其他编程元素,使得程序员可以方便地使用UNIX系统提供的各种服务。这个名为"UNIX头文件大全"的...
理解系统调用的工作原理,如syscalls.h头文件中的定义,以及strace工具的使用,有助于深入理解系统底层运作。 8. **文件系统**:UNIX的文件系统模型,包括文件权限、硬链接、符号链接、目录操作以及文件系统挂载等...