本节介绍如何在信号编号和信号名之间进行映射。某些系统提供数组

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 将返回描述该信号的字符串。应用程序可用该字符串打印关于接收到信号的出错消息。

本书讨论的所有平台都提供psignalstrsignal函数,但相互之间有些差别。在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”)。

注意,sig2strstr2sig与常用的函数做法不同,当它们失败时,并不设置errno

results matching ""

    No results matching ""