- 浏览: 593730 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
月光杯:
问题解决了吗?
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 571std::map<char,int> my ... -
lost on Py_DECREF/INCREF when handling PyList_Append in Python C extension
2015-11-03 21:41 1008The main hint is in the docs, i ... -
An Example of Using std::tr1::bind
2014-03-10 16:49 1471#include <iostream> #i ... -
c++中的virtual inheritance
2014-01-27 10:20 750http://stackoverflow.com/questi ... -
Java的Generics和c++的Template到底有什么不同?
2012-12-27 16:21 3178先了解Java的Generics: 根据Java的文档,Jav ... -
Calculating Permutations and Job Interview Questions
2011-06-18 17:44 905http://www.bearcave.com/random_ ... -
字符串指针、字符数组的sizeof和strlen结果
2010-09-27 08:36 1417int main(){ char *p1=" ... -
code snippet
2010-09-27 08:31 885char temp[3]; char temp2[3]; ... -
虚继承
2010-09-26 09:03 922http://www.cppblog.com/franksun ... -
调整堆的算法
2010-09-25 10:34 1109Begin adjustHeap(A[], i) // He ... -
multiset usage as heap
2010-09-24 21:37 1407Middle number There is a seque ... -
虚函数表又是怎样实现的?
2010-09-20 22:01 1279每个含有虚函数的类 ... -
正整数分解算法
2010-09-19 16:56 3982问题:将以正整数n表 ... -
异或运算法则
2010-09-14 09:47 21401. a ^ b = b ^ a 2 ... -
常量字符串为什么位于静态存储区
2010-09-13 22:41 1195http://hi.baidu.com/%D0%C7%BB%F ... -
errno.h
2010-08-10 08:46 1461查看错误代码errno是调试程序的一个重要方法。当linuc ... -
How to use fallocate system call
2010-08-07 22:19 3389/* * fallocate - utility to u ... -
Test performance of allocating a zeroed file via various methods
2010-08-07 22:09 1073/* * Test performance of a ... -
how to reverse the word sequence in a sentence?
2010-07-06 22:01 1193For example, "Welcome ... -
c++ dynamic binding
2010-07-06 21:20 859Good tutorial about c++ dynamic ...
相关推荐
Python中对信号处理的模块主要是使用signal模块,但signal主要是针对Unix系统,所以在Windows平台上Python不能很好的发挥信号处理的功能。 要查看Python中的信号量,可以使用dir(signal)来查看。 signal.signal() 在...
首先定义一个服务函数function(),然后利用signal(sig,function)系统调用来实现中断的捕获与改道。 (5)使用操作系统保留给用户的信号SIGUSR1和SIGUSR2进行通信。 (6)扩展程序,使之成为信号或事件驱动的应用程序。 ...
第8章 UNIX系统界面 8.1 文件描述符 8.2 低级I/O—read和write系统调用 8.3 open、creat、close和unlink系统调用 8.4 随机访问—lseek系统调用 8.5 实例—fopen和getc函数的一种实现 方法 8.6 实例—目录显示 ...
第8章 UNIX系统界面 8.1 文件描述符 8.2 低级I/O—read和write系统调用 8.3 open、creat、close和unlink系统调用 8.4 随机访问—lseek系统调用 8.5 实例—fopen和getc函数的一种实现 方法 8.6 实例—目录显示 ...
第8章 UNIX系统界面 8.1 文件描述符 8.2 低级I/O—read和write系统调用 8.3 open、creat、close和unlink系统调用 8.4 随机访问—lseek系统调用 8.5 实例—fopen和getc函数的一种实现 方法 8.6 实例—目录显示 ...
第8章 UNIX系统界面 8.1 文件描述符 8.2 低级I/O—read和write系统调用 8.3 open、creat、close和unlink系统调用 8.4 随机访问—lseek系统调用 8.5 实例—fopen和getc函数的一种实现 方法 8.6 实例—目录显示 ...
第8章 UNIX系统界面 8.1 文件描述符 8.2 低级I/O—read和write系统调用 8.3 open、creat、close和unlink系统调用 8.4 随机访问—lseek系统调用 8.5 实例—fopen和getc函数的一种实现 方法 8.6 实例—目录显示 ...
其中FILE应为大写,它实际上是由系统定义的一个结构, 该结构中含有文件名、文件状态和文件当前位置等信息。 在编写源程序时不必关心FILE结构的细节。例如:FILE *fp; 表示fp是指向FILE结构的指针变量,通过fp ...
它是要对于程序员来说容易理解,而不是提供给编译器实现者的定义—这正是标准承担的角色。附录B是对标准库提供的功能的总结。附录C是对以前版本的变动的小结。就像我们在第1版序中所说的,“当对C的经验增加时它显得...
信号处理器的创建函数定义如下: gint gtk_signal_connect( GtkObject *object, gchar *name,GtkSignalFunc callback_func, gpointer func_data ); 返回值是一个区分同一对象中的事件与不同回调函数的关联标签。这样...
其中最主要定义了tm 结构和一些有关时间的函数原形。 /* * we need this inline - forking from kernel space will result * in NO COPY ON WRITE (!!!), until an execve is executed. This * is no problem, ...
7- 9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。 initdefault是一个特殊的...
信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程...
#include <signal.h> #include #include #include #include #include #define PRECHILD 5 #define MAXCHILD 50 #define BUFSIZE 4096 #define PIDPATH "pid" #define head503 ...
进程定义 (Process)............................................................................. 27 1.2.8 认证信息 (Auth Info)............................................................................