指针与声明
- 声明
1、C语言中变量的声明
类型(type) 声明符(declarator)
2、最简单的声明是变量
3、指针数组
- 指针数组是一个数组
- 数组里的元素都是指针
- 例:int *daytab[13]
4、数组指针
- 数组指针是一个指针
- 指针指向一个类型和元素个数都固定的数组
- 例:int (*daytab1)[13]
5、指针函数
- 指针函数是函数
- 函数的返回值是指针类型
- 例:int *comp()
6、函数指针
- 函数指针是指针
- 指针指向函数
- 函数名就是函数指针
- 例:int (*comp1)()
7、类型识别法:右左右左法
从变量名开始,先右再左地,交替地一个一个向外看,在纸上写下:“变量是” 若向右遇到左圆括号,在纸上写下:“函数,参数是”,并用同样的方法处理括号中每一个参数——在纸上写下:“返回” 若向右遇到方括号,在纸上写下:“数组,长度为{方括号的内容},元素类型为” 若向右遇到右圆括号,什么也不做 若向左遇到*,在纸上写下:“指针,指向” 若向左遇到任何类型,在纸上写下对应的类型名
8、自定义类型:typedef
9、char ((x())[])()
分析:x是函数,无参数,返回指针,指向数组,长度不确定,元素类型为指针,指向函数,无参数,返回void
10、char ((x[3])())[5]
分析:x是数组,长度为3,元素类型为指针,指向函数,无参数,返回指针,指向数组,长度为5,元素类型为char
信号处理
- 信号
1、信号是UNIX中使用的进程通信的一种最古老的方法
2、信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的
- 查看信号信息
1、命令
kill -l
每个信号都有一个编号和一个宏定义名称,宏定义可以在signal.h中找到
2、命令
man 7 signal
查看信号的产生条件、默认处理动作
- 信号生命周期:信号产生、信号注册、信号注销、信号处理
1、信号产生
- 用户产生
例:在终端中按下Ctrl+C产生SIGINT信号,可以通过
stty -a
查看可以产生信号的按键组合- 硬件产生
硬件异常产生信号,例:当前进程执行了除以0的指令
- 进程产生
例:可在shell进程下,使用命令 kill -信号标号 PID,向指定进程发送信号。
- 内核产生
例:闹钟超时产生SIGALRM信号
2、信号处理
- 捕捉信号
命令:man -k signal
可以检索相关函数,通过man 2 signal
可以查看signal的帮助文档
signal(SIGINT,f)演示了如何捕捉信号,这个程序捕捉了中断信号
void f(int signum)演示了如何定义信号处理函数
- 忽略信号
忽略中断信号:把信号处理函数指针传为SIG_IGN
通过grep命令查看SIG_IGN,表示无返回值的函数指针,指针值为1
- 默认操作
默认信号:SIG_DFL是默认信号的处理程序
通过grep命令查看SIG_DFL,表示无返回值的函数指针,指针值为0
把SIG_IGN改成SIG_DFL
- 多信号处理
-SIGX打断SIGX的情况处理方法:
1、递归,调用同一个处理函数
2、忽略第二个信号
3、阻塞第二个信号知道第一个处理完毕
- signal与sigaction
1、signal:
不知道信号被发送的原因 信号处理过程中不能安全地阻塞其他信号
2、sigaction:
在信号处理程序被调用时,系统建立的新信号屏蔽字会自动包括正被递送的信号。因此保证了在处理一个给定的信号时,如果这种信号再次发生,那么它会被阻塞到对前一个信号的处理结束为止
响应函数设置后就一直有效,不会重置