附加功能

附加功能

在这节,我们描述一些依赖于具体实现的附加信号功能。

信号名

一些系统提供了数组

   extern char *sys_siglist[];

数组的索引是信号号,通过指针指向信号名的字符串。

【FreeBSD 5.2.1, Linux 2.4.22和Mac OS X 10.3都提供这个信号名数组。Solaris 9也这么做,不过它使用的名字是_sys_siglist。】

这些系统一般也提供psignal函数。

#include <signal.h>

void psignal(int signo, const char *msg);

字符串msg(这一般是程序名)输出到标准错误,后面跟一个冒号和一个空格,然后是信号的描述,然后是一个换行符。这个函数类似于perror(APUE 1.7节)

另一个常用函数是strsignal。这个函数类似于strerror(APUE1.7节)

#include <string.h>

char *strsignal(int signo);

Returns: a pointer to a string describing the signal

给出一个信号号,strsignal将会返回一个字符串它描述了该信号。这个字符串能被应用程序打印出来。

【APUE中所描述的所有平台都提供psignalstrsignal函数,但也有一些不同。在Solaris 9上,strsignal如果信号号无效,那么会返回一个空指针,而FreeBSD5.2.1, Linux 2.4.22和Mac OS X 10.3返回一个字符串来指明该信号没有注册。同样,在Solaris上获得psignal的原形要包含<siginfo.h>头文件。

信号映射

Solaris提供了一对函数对应射信号号到信号名,反之亦然。

#include <signal.h>

int sig2str(int signo, char *str);

int str2sig(const char *str, int *signop);

Both return: 0 if OK, 1 on error

当写交互程序需要接受和打印信号名和信号号时这些函数非常有用。

sig2str函数转换信号号到字符串并在内存中存储结果,由str指向。调用者必须确认内存足够大,能够存下最大字符长度和结节的空字符。Solaris在<signal.h>中提供了一个常量SIG2STR_MAX用来定义最大字符长度。信号名的组程不包含”SIG”前缀。例如,信号SIGKILL转换名字为“KILL”存储。

str2sig函数转换信号名到信号号。信号号使用整型变量保存,由指针signop指向。信号名可以是没有“SIG”前缀的名字或十进制信号号的字符描述(也就是“9”这样)。

注意,惯例不使用sig2strstr2sig并且当它们失败后并不设置errno

发表评论