我需要在信号处理程序函数中打印出一个字符串以及一个整数。有人告诉我写是信号安全的。到目前为止,我尝试用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;
}
答案 0 :(得分:2)
当我编译程序并通过hexdump
重定向输出时,这是我得到的输出:
$ gcc t.c $ ./a.out | hexdump 0000000 86a0 0001 0000004 $
然后,我们注意到十六进制的100000
是0x186a0
。您的程序要做的是为代表数字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
可能就足够了,但是现在到现在,它都会崩溃,所以不要在您提供给其他程序的程序中这样做人。