曲径通幽论坛

标题: psignal() -- strsignal() 函数的语言敏感版本 [打印本页]

作者: beyes    时间: 2012-7-30 16:30
标题: psignal() -- strsignal() 函数的语言敏感版本
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[] 是个存储了预定义信号描述信息的数组。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2