-
Notifications
You must be signed in to change notification settings - Fork 54
signal
果冻虾仁 edited this page Aug 22, 2017
·
5 revisions
对一个信号指定新动作或回到其原先的动作
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);signum即信号值。后面的handler就是处理这个信号的动作。它的值为:
- SIG_DFL:默认动作
- SIG_IGN:忽略该信号(SIGKILL和SIGSTOP无法忽略,因为要保证root的绝对控制权)
- 信号句柄
信号句柄即捕获函数(这里是函数指针类型),该函数必须是只有一个整型参数,且返回值为void。
信号发送时,如果建立了信号句柄,系统在把控制转移到信号句柄之前有两种做法:
- 将阻塞后继新的信号直至信号句柄完成为止
- 或这首先改变该信号的动作为SIG_DEL(相当于调用signal(signum,SIG_DEL),在执行完一次信号句柄之后,将其恢复为默认动作)
BSD系统使用前者,系统V使用后一种。Linux默认采用BSD的做法,但当设置了特征测试宏_XOPEN_SOURCE时,则采用系统V的做法,此时编译时要这样编译
gcc test.c -D_XOPEN_SOURCE
返回值是指向信号signum前一次有效动作的指针。它和函数第二个参数类型相同。返回值是:
- SIG_DFL
- SIG_IGN
- 信号句柄指针
可以保存这个值,并且在以后用它作为函数第二个参数再次调用signal(),从而恢复信号原来的动作
如果出错,返回SIG_ERR并设置errno。唯一地错误码(errno)是EINVAL
Talk is cheap, show me the code!
C语言API包含部分标准C的API、POSIX标准的系统编程API(一些Linux独有的系统API会单独注明)。
大部分头文件源码在/usr/include目录下。
因为涉及到大量的POSIX编程。所以最好下载POSIX函数的man手册。
apt-get install manpages-posix
apt-get install manpages-posix-dev
默认安装了manpages-dev,所以不装POSIX的man手册是可以查看绝大部分API的。
但是不装的话,有些API是不能看到的,比如posix_spawn函数。
yum install man-pages.noarch
关于目录
左侧的目录并非以函数为索引依据,主要是以系统的man手册页面为索引依据。
比如exec里面包含6个函数、pipe里面包含pipe()和pipe2()两个函数,但是它们都是属于一个man页面中。