本节介绍如何在信号编号和信号名之间进行映射。某些系统提供数组
extern char *sys_siglist[];
数组下标是信号编号,数组中的元素是指向信号名符串的指针。
FreeBSD 8.0、Linux 3.2.0和Mac OS X 10.6.8都提供这种信号名数组。Solaris 10也提供信号名数组,但该数组名是_
sys_siglist
。
可以使用psignal
函数可移植地打印与信号编号对应的字符串。
#include <signal.h>
void psignal(int signo, const char *msg);
字符串msg
(通常是程序名)输出到标准错误文件,后面跟随一个冒号和一个空格,再后面对该信号的说明,最后是一个换行符。如果msg
为NULL,只有信号说明部分输出到标准错误文件,该函数类似于perror
(1.7节)。
如果在sigaction
信号处理程序中有siginfo
结构,可以使用psiginfo
函数打印信号信息。
#include <signal.h>
void psiginfo(const siginfo_t *info, const char *msg);
它的工作方式与 psignal
函数类似。虽然这个函数访问除信号编号以外的更多信息,但不同的平台输出的这些额外信息可能有所不同。
如果只需要信号的字符描述部分,也不需要把它写到标准错误文件中(如可以写到日志文件中),可以使用strsignal
函数,它类似于strerror
(另见1.7节)。
#include <string.h>
char *strsignal(int signo);
//返回值:指向描述该信号的字符串的指针
给出一个信号编号,strsignal
将返回描述该信号的字符串。应用程序可用该字符串打印关于接收到信号的出错消息。
本书讨论的所有平台都提供
psignal
和strsignal
函数,但相互之间有些差别。在Solaris 10中,若信号编号无效,strsignal
将返回一个空指针,而FreeBSD 8.0、Linux 3.2.0和MacOS X 10.6.8则返回一个字符串,它指出信号编号是不可识别的。只有Linux 3.2.0和Solaris 10支持
psiginfo
函数。
Solaris提供一对函数,一个函数将信号编号映射为信号名,另一个则反之。
#include <signal.h>
int sig2str(int signo, char *str);
int str2sig(const char *str, int *signop);
//两个函数的返回值:若成功,返回0;若出错,返回−1
在编写交互式程序,其中需接收和打印信号名和信号编号时,这两个函数是有用的。
sig2str
函数将给定信号编号翻译成字符串,并将结果存放在str
指向的存储区。调用者必须保证该存储区足够大,可以保存最长字符串,包括终止 null
字节。Solaris 在<signal.h
>中包含了常量SIG2STR_MAX
,它定义了最大字符串长度。该字符串包括不带“SIG”前缀的信号名。例如,SIGKILL
被翻译为字符串“KILL”,并存放在str指向的存储缓冲区中。
str2sig
函数将给出的信号名翻译成信号编号。该信号编号存放在signop
指向的整型中。名字要么是不带“SIG
”前缀的信号名,要么是表示十进制信号编号的字符串(如“9”)。
注意,sig2str
和str2sig
与常用的函数做法不同,当它们失败时,并不设置errno
。