Write()给出整数的怪异符号

时间:2019-02-26 23:39:42

标签: c linux

我需要在信号处理程序函数中打印出一个字符串以及一个整数。有人告诉我写是信号安全的。到目前为止,我尝试用write打印出一个整数,但是它发出了奇怪的符号。 Write适用于字符的char数组,但不适用于整数。任何建议将不胜感激。下面是我的代码,释放了该错误。

    #include<stdio.h> 
    #include<wait.h> 
    #include<signal.h> 
    #include<unistd.h>
    int main() 
    { 
        int x[] = {100000};
        write(1, x, sizeof(x));
        return 0;
    }

2 个答案:

答案 0 :(得分:2)

当我编译程序并通过hexdump重定向输出时,这是我得到的输出:

$ gcc t.c
$ ./a.out | hexdump
0000000 86a0 0001
0000004
$

然后,我们注意到十六进制的1000000x186a0。您的程序要做的是为代表数字100000的对象发出原始字节。

如果要将数字100000打印到ASCII输出中,可以编写自己的例程。例如:

void
print_number(unsigned x) {
    if (x >= 10) print_number(x/10);
    write(1, "0123456789" + (x%10), 1);
}

一种更好的方法是将转换后的字符发送到缓冲区中,并对现在包含数字字符串版本的缓冲区文本使用单个write调用。

答案 1 :(得分:1)

以下是构成内存中整数100000的字节,我已将其转换为十六进制:

A0 86 01 00

以下是write(1, x, sizeof(x))打印的字节(十六进制):

A0 86 01 00

以下是printf("%d", x[0])打印的字节(十六进制):

31 30 30 30 30 30

31(十六进制)是数字1的ASCII代码,而30是数字0的ASCII代码。但是A0、87、01和00是奇怪的符号。当您使用printf时,它将数字转换为供人类阅读的内容; write不进行这种转换。

要以人们可以理解的方式在控制台上打印数字,请使用printf。但是,您说您不应该在信号处理程序中使用printf,这是正确的,因为您不应该在信号处理程序中写入控制台。 (如果您的信号处理程序在其他写入过程中进行写入,可以吗?)

如果这只是一个测试,那么在信号处理程序中调用printf可能就足够了,但是现在到现在,它都会崩溃,所以不要在您提供给其他程序的程序中这样做人。