曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5325|回复: 0
打印 上一主题 下一主题

[信号] psignal() -- strsignal() 函数的语言敏感版本

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-7-30 16:30:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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[] 是个存储了预定义信号描述信息的数组。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-1 22:55 , Processed in 0.078051 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表