psignal() 原型如下:
[C++] 纯文本查看 复制代码 #include <signal.h>
void psignal(int sig, const char *s);
该函数是 strsignal() 的语言敏感版本,也就是它可以以当地语言来显示信号的描述信息。运行该函数时,它会自动打印出信息描述信息,这些信息是从标准错误(stderr) 输出的。
函数有 2 个参数,第 1 个参数 sig 指定信号,第 2 个参数是个自定义前缀字符串,可以为 NULL,如果不为 NULL,它也会被打印出来。
测试代码:
[C++] 纯文本查看 复制代码 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <locale.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL, "");
if (argc != 2) {
printf ("usage: %s sig_num\n");
exit (EXIT_FAILURE);
}
int sig;
char s[1024];
strcpy (s, "Signal ");
strncat (s, argv[1], 4);
sig = atoi(argv[1]);
psignal(sig, (const char *)s);
return 0;
}
运行输出:$ ./psignal 2
Signal 2: 中断
$ ./psignal 3
Signal 3: 退出
$ ./psignal 3333
Signal 3333: 未知的信号 3333
程序中使用 setlocale() 函数进行地区转换,这样就能以中文打印出描述信息(系统默认安装语言为简体中文) 。
另外,s 是自定义字符串,在 psignal() 输出时,会先打印出这个字符串,接着在其后添加一个“冒号”,然后才是信号描述信息。
psignal 的源码如下实现:
[C++] 纯文本查看 复制代码 #include <sys/signal.h>
#include <string.h>
#include <unistd.h>
extern const char *const sys_siglist[];
void
psignal(sig, s)
unsigned int sig;
const char *s;
{
register const char *c;
register int n;
if (sig < NSIG)
c = (char *)sys_siglist[sig];
else
c = "Unknown signal";
n = strlen(s);
if (n) {
(void)write(STDERR_FILENO, s, n);
(void)write(STDERR_FILENO, ": ", 2);
}
(void)write(STDERR_FILENO, c, strlen(c));
(void)write(STDERR_FILENO, "\n", 1);
}
sys_siglist[] 是个存储了预定义信号描述信息的数组。 |