c - 为什么 printf 显示 unsigned int 的负值?

标签 c linux linux-kernel system-calls

<分区>

Possible Duplicate:
Unsigned long with negative value

我写了一个内核模块,它可以中断任何系统调用,打印它的当前 user_id 和传递给系统调用函数的输入参数。其中,一个是sys_ioctl()如下:

asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd,unsigned long arg);

这意味着所有输入参数都是无符号整数。

但是当我打印输入参数时,我得到以下输出:

 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 ----------

这是我的函数定义:

asmlinkage long our_sys_ioctl(unsigned int fd ,  unsigned int cmd , unsigned long arg)
{
    uid_t gtuid ;
    gtuid = getuid_call();
    printk ("our_sys_ioctl ---> uid = %d with fd=%i, cmd=%i and arg=%lu \n ", gtuid, fd, cmd, arg);
    return original_call_ioctl(fd , cmd , arg);
}

知道为什么 cmd 值为负以及这些值是什么意思吗?

最佳答案

当您使用 %i 打印 cmd 时,您将它转换为 signed int 作为@Mario先前猜测。这就是它为负数的原因。

您需要使用 %u 进行打印以使其保持 unsigned int

d or i - Signed decimal integer

u - Unsigned decimal integer

(来自:http://www.cplusplus.com/reference/cstdio/printf/)

这将如您所愿地工作。

printk ("our_sys_ioctl ---> uid = %d with fd=%i, cmd=%u and arg=%lu \n ", gtuid, fd, cmd, arg);
                                                    ^^^^

关于c - 为什么 printf 显示 unsigned int 的负值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14181691/

相关文章:

c - 开机后如何在android中自动运行可执行文件?

linux - 与 Linux 上的 pid 和进程混淆

ubuntu - insmod 无法插入一个非常简单的模块

c - Frama-C/WP 无法证明循环不变性

C++ 解析输入

c - 如何在 C 中将字符串拆分成固定长度的小块以从 Arduino BLE 发送?

tcp - 当 TCP 连接数超过 65000 时服务器发送 RST 给客户端~

c - 从目录中读取多个文件?

linux - 如何在 Docker 中使用容器的内部 IP 地址作为环境变量

android - 将供应商服务添加到 ServiceManager with android treble architecture[SELinux policy]